Modificando el último elemento de una matriz en MongoDB

Tengo una estructura de objeto como esta:

 {
    name: "...",
    pockets: [
        {
            cdate: "....",
            items: [...]
        }
        ...
    ]
 }

En una operación de actualización, quiero agregar algunos registros en el artículos campo de la última bolsillo ít. El uso de la notación de puntos es la única forma que conozco de acceder a un subdocumento, pero no puedo obtener lo que quiero. Entonces, estoy buscando algo como esto:

  • bolsillos.-1.artículos
  • bolsillos.$últimos.artículos

¿Es posible modificar el último elemento? Si es así, ¿cómo?

preguntado el 22 de mayo de 12 a las 19:05

¿Estoy en lo cierto que desea modificar items, no ir a buscarlo? -

Sí, estás en lo correcto. Al buscar, puedo usar el operador $slice. -

Estoy bastante seguro de que esto no se puede hacer con una simple actualización a menos que tenga alguna otra forma de hacer coincidir el último bolsillo. -

¿Puedes modificar el encabezado a "..... en MongodB"? Esto no está claro. -

2 Respuestas

No conozco una manera de hacer esto usando una consulta de una sola línea. Pero puede seleccionar el registro, actualizarlo y luego guardarlo.

var query = <insert query here>;
var mydocs = db.mycollection.find(query);
for (var i=0 ; i<mydocs.length ; i++) {
    mydocs[i].pockets[pockets.length-1].items.push('new item');
    db.mycollection.save(mydoc);
}

contestado el 22 de mayo de 12 a las 19:05

esto puede no ser seguro para subprocesos, ya que otro proceso podría haber modificado la matriz después de la búsqueda y antes de guardar. - Asya Kamsky

No creo que sea posible hacerlo atómicamente. Hay un solicita para que esta funcionalidad se agregue a MongoDB.

Si puede garantizar la seguridad de subprocesos en su solicitud código, probablemente podría usar una secuencia de $pop de la matriz de bolsillos (que elimina el último elemento de los bolsillos) a la variable p y luego $addToSet a p.items, ahora puede $empujar p de vuelta a los bolsillos. Pero si su aplicación no tiene una manera de garantizar que solo un proceso pueda estar haciendo esto a la vez, entonces otro proceso podría modificar la matriz en medio de esos pasos y puede terminar perdiendo esa actualización.

También puede consultar la semántica "Actualizar si es actual". aquí para ver otra forma en que puede evitar una posible carrera por un problema de múltiples subprocesos.

contestado el 22 de mayo de 12 a las 22:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.