sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo eliminar un elemento de una matriz doblemente anidada en un documento MongoDB.

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

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

Hay un poco de "magia" sucediendo aquí. Usando .0 indica que sabemos que estamos modificando el elemento 0 de someArray . Usando {"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 peor si desea realizar consultas "genéricas" que realizan estas operaciones.

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

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

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

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

Aquí está el problema con su estructura. MongoDB no tiene muy buen soporte para manipular "sub-matrices". 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 subarray tienes dos opciones:

  1. Cambia tu estructura para que puedas aprovechar $pull .
  2. No use $pull . Cargue todo el objeto en un cliente y use findAndModify .