varios modificar insertar documentos documento datos consultas como comandos campo anidadas agregar mongodb

modificar - mongodb consultas anidadas



Cómo eliminar un elemento de una matriz doblemente anidada en un documento MongoDB (2)

Como @Melkor ha comentado (probablemente debería ser una respuesta en sí misma),

Si no conoce el uso del índice:

{_id: TheMainID, theArray._id: TheArrayID}, {$pull: {"theArray.$.theNestedArray": {_id: theNestedArrayID}}}

Tengo un documento estructura algo en la línea de lo siguiente:

{ "_id" : "777", "someKey" : "someValue", "someArray" : [ { "name" : "name1", "someNestedArray" : [ { "name" : "value" }, { "name" : "delete me" } ] } ] }

Quiero eliminar el elemento de matriz anidado con el valor "eliminarme".

Sé que puedo encontrar documentos que coincidan con esta descripción usando expresiones $ elemMatch anidadas. ¿Cuál es la sintaxis de consulta para eliminar el elemento en cuestión?


Para eliminar el elemento en cuestión, en realidad usará una actualización. Más específicamente, vas a hacer una actualización con el comando $pull que eliminará el elemento de la matriz.

db.temp.update( { _id : "777" }, {$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}} )

Hay un poco de "magia" pasando aquí. El uso de .0 indica que sabemos que estamos modificando el 0 ° elemento de someArray . El uso de {"name":"delete me"} indica que conocemos los datos exactos que planeamos eliminar.

Este proceso funciona bien si carga los datos en un cliente y luego realiza la actualización. Este proceso funciona menos si quiere hacer consultas "genéricas" que realizan estas operaciones.

Creo que es más fácil simplemente reconocer que la actualización de matrices de sub documentos generalmente requiere que tenga el original en la memoria en algún momento.

En respuesta al primer comentario a continuación, probablemente pueda ayudar a su situación cambiando un poco la estructura de datos

"someObjects" : { "name1": { "someNestedArray" : [ { "name" : "value" }, { "name" : "delete me" } ] } }

Ahora puede hacer {$pull : { "someObjects.name1.someNestedArray" : ...

Aquí está el problema con tu estructura. MongoDB no tiene un soporte muy bueno para manipular "sub-arrays". Su estructura tiene una matriz de objetos y esos objetos contienen matrices de más objetos.

Si tiene la siguiente estructura, tendrá dificultades para usar cosas como $pull :

array [ { subarray : array [] }, { subarray : array [] }, ]

Si su estructura se ve así y desea actualizar el subarray , tiene dos opciones:

  1. Cambie su estructura para que pueda aprovechar $pull .
  2. No use $pull . Cargue todo el objeto en un cliente y use findAndModify .