2010-12-17 14 views
13

que tiene la siguiente mongodb objeto:PHP/MongoDB: actualizar un valor en una matriz

{ 
    "_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" 
} 

¿Cómo puedo configurar "leer" a 1 donde id = ABCDZZZZ? Estoy usando PHP.

He intentado el siguiente comando:

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

Pero cuando hago esto, se produce la sobreescritura y me sale:

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

estoy totalmente atascado. Cualquier ayuda muy apreciada.

¿Debo extraer todo el elemento de la matriz, modificar y volver a insertarlo?

Muchas gracias de antemano,

+0

posible duplicado de [actualización de MongoDB matriz anidada] (http://stackoverflow.com/questions/11261521/mongodb-update-nested-array) – user956584

+0

En realidad, ahora mismo es posible: http://stackoverflow.com/questions/ 11261521/mongodb-update-nested-array – user956584

Respuesta

16

Si usted lee su comando, en realidad está diciendo: "ACTUALIZACIÓN donde los mensajes uname = Eamorr3 fija igual a esta matriz (id = bla, leen = 1)"

Cuando hace un $set en messages, básicamente le indica que tome su matriz como el nuevo valor.

Sin embargo, parece que está intentando actualizar un mensaje específico como leído, que es un poco más complejo. Así que hay dos obstáculos aquí:

1: en realidad está actualizando messages.0.read

Si lo hace array('$set' => array('messages.0.read' => 1)), actualizará el elemento correcto. Siga esa cadena, messages es un objeto javascript y desea actualizar la propiedad 0. La propiedad 0 es en sí misma un objeto javascript que contiene la propiedad read que desea actualizar.

¿Puedes ver cómo estás actualizando messages.0.read?

Esto nos lleva al problema # 2.

2: el 0 es un problema para usted

Si nos fijamos en la forma en que ha estructurado los datos de Mongo, los mensajes objeto es muy por debajo del par. El "0" y el "1" actúan actualmente como "ids" y no son muy útiles. Personalmente, estructuraría sus objetos con los ID reales en lugar de "0" o "1".

Así que sus objetos se vería como la siguiente:

{ 
    "_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" 
} 

ahora estás comando de actualización se convierte en esto:

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

Esta estructura hace que sea mucho más fácil de actualizar un mensaje específico o una porción específica de un mensaje.

+0

Oye, estaba pensando en una reestructuración como la que mencionaste. Creo que esta es probablemente la mejor manera de hacerlo. De lo contrario, tendré que buscar en toda la matriz, encontrar el índice del objeto y actualizar. – Eamorr

+0

También echa un vistazo a [$ elemMatch] (http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-Matchingwith%24elemMatch) – webjay

2

Si desea mantener la estructura de la matriz para diversos fines, puede usar la Positional operator. Esto le permite aprovechar las características de la matriz ($ pop, $ push, etc.) al tiempo que puede actualizar elementos que se encuentran en una posición de matriz desconocida.

Cuestiones relacionadas