2010-12-17 13 views
13

Ich habe folgendes mongodb Objekt:PHP/MongoDB: aktualisieren Wert in einem Array

{ 
    "_id": ObjectId("4d0b9c7a8b012fe287547157"), 
    "messages": { 
    "0": { 
     "toUname": "Eamorr3", 
     "fromUname": "Eamorr2", 
     "time": 1292606586, 
     "id": "ABCDZZZ", 
     "subject": "asdf", 
     "message": "asdf", 
     "read": 0 //I want to change this to 1! 
    }, 
    "1": { 
     "toUname": "Eamorr1", 
     "fromUname": "Eamorr3", 
     "time": 1292606586, 
     "id": "EFGHZZZ", 
     "subject": "asdf2", 
     "message": "asdf2", 
     "read": 0 
    } 
    }, 
    "uname": "Eamorr3" 
} 

Wie kann ich "lesen" auf 1, wo id = ABCDZZZZ gesetzt? Ich benutze PHP.

Ich habe den folgenden Befehl versucht:

$driverInboxes->update(array('uname'=>$uname),array('$set'=>array('messages'=>array('id'=>$id,'read'=>'1')))); 

Aber wenn ich das tue, Überschreibung stattfindet und ich:

{ 
    "_id": ObjectId("4d0b9c7a8b012fe287547157"), 
    "messages": { 
    "id": "j7zwr2hzx14d3sucmvp5", 
    "read": "1" 
    }, 
    "uname": "Eamorr3" 
} 

Ich bin total fest. Jede Hilfe wird sehr geschätzt.

Muss ich das gesamte Array-Element ziehen, ändern und wieder einschieben?

Vielen Dank im Voraus,

+0

mögliche Duplikate von [MongoDB Update verschachtelten Array] (http://StackOverflow.com/Questions/11261521/Mongodb-Update-Nested-Array) – user956584

+0

Eigentlich gerade jetzt ist es möglich: http://StackOverflow.com/Questions/ 11261521/mongodb-update-nested-Array – user956584

Antwort

16

Wenn Sie Ihren Befehl lesen, sind Sie eigentlich sagen: "UPDATE WHERE uname = Eamorr3 SET-Nachrichten gleich diesem Array (id = blah, lesen = 1)"

Wenn Sie eine $set auf messages machen, weisen Sie sie grundsätzlich an, Ihr Array als den neuen Wert zu nehmen.

Es sieht jedoch so aus, als ob Sie versuchen, eine bestimmte Nachricht als gelesen zu aktualisieren, die nur ein wenig komplexer ist. So gibt es zwei Hürden hier:

1: Sie sind tatsächlich messages.0.read

Aktualisierung Wenn Sie array('$set' => array('messages.0.read' => 1)) tun, werden Sie das richtige Element aktualisieren. Folgen Sie dieser Kette, messages ist ein JavaScript-Objekt, und Sie möchten die Eigenschaft 0 aktualisieren. Die Eigenschaft 0 ist selbst ein JavaScript-Objekt, das die Eigenschaft read enthält, die Sie aktualisieren möchten.

Können Sie sehen, wie Sie aktualisieren messages.0.read?

Dies bringt uns zu Problem # 2.

2: die 0 ist ein Problem für Sie

Wenn man sich die Art und Weise sehen Sie die Daten in Mongo strukturiert haben, widersprechen die Nachrichten wirklich unterdurchscnittlich ist. Die "0" und "1" sind derzeit als "IDs" und sie sind nicht sehr nützlich. Persönlich würde ich Ihre Objekte mit den tatsächlichen IDs anstelle von "0" oder "1" strukturieren.

So würde Ihre Objekte wie folgt aussehen:

{ 
    "_id": ObjectId("4d0b9c7a8b012fe287547157"), 
    "messages": { 
    "ABCDZZZ": { 
     "toUname": "Eamorr3", 
     "fromUname": "Eamorr2", 
     "time": 1292606586, 
     "subject": "asdf", 
     "message": "asdf", 
     "read": 0 //I want to change this to 1! 
    } 
    }, 
    "uname": "Eamorr3" 
} 

Jetzt sind Sie Update-Befehl wird folgendermaßen aus:

array('$set' => array('messages.ABCDZZZ.read' => 1))

Diese Struktur macht es viel einfacher, eine bestimmte Nachricht zu aktualisieren oder ein bestimmter Teil einer Nachricht.

+0

Hey, ich dachte, wie die Art und Weise der Umstrukturierung Sie erwähnt. Ich denke, das ist wahrscheinlich der beste Weg. Ansonsten muss ich das gesamte Array durchsuchen, den Objektindex suchen und aktualisieren. – Eamorr

+0

Werfen Sie auch einen Blick auf [$ elemMatch] (http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-Matchingwith%24elemMatch) – webjay

2

Wenn Sie die Array-Struktur für verschiedene Zwecke behalten möchten, können Sie die Positional operator verwenden. Dadurch können Sie die Vorteile von Array-Funktionen ($ pop, $ Push usw.) zu nehmen, während gleichzeitig der Lage, Elemente zu aktualisieren, die in einer unbekannten Feldposition sind.

Verwandte Themen