MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como remover um elemento de uma matriz duplamente aninhada em um documento MongoDB.


Para excluir o item em questão, você realmente usará uma atualização. Mais especificamente, você fará uma atualização com o $pull comando que irá remover o item da matriz.
db.temp.update(
  { _id : "777" },
  {$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}}
)

Há um pouco de "mágica" acontecendo aqui. Usando .0 indica que sabemos que estamos modificando o 0º item de someArray . Usando {"name":"delete me"} indica que sabemos os dados exatos que planejamos remover.

Esse processo funciona bem se você carregar os dados em um cliente e depois realizar a atualização. Esse processo funciona menos se você deseja fazer consultas "genéricas" que executam essas operações.

Eu acho que é mais fácil simplesmente reconhecer que atualizar matrizes de subdocumentos geralmente requer que você tenha o original na memória em algum momento.

Em resposta ao primeiro comentário abaixo, você provavelmente pode ajudar sua situação alterando um pouco a estrutura de dados
"someObjects" : {
  "name1":  {
        "someNestedArray" : [
            {
                "name" : "value"
            },
            {
                "name" : "delete me"
            }
        ]
    }
}

Agora você pode fazer {$pull : { "someObjects.name1.someNestedArray" : ...

Aqui está o problema com sua estrutura. O MongoDB não tem um suporte muito bom para manipular "sub-arrays". Sua estrutura tem uma matriz de objetos e esses objetos contêm matrizes de mais objetos.

Se você tiver a estrutura a seguir, terá dificuldade em usar coisas como $pull :
array [
  { subarray : array [] },
  { subarray : array [] },
]

Se sua estrutura for assim e você deseja atualizar subarray você tem duas opções:
  1. Mude sua estrutura para que você possa aproveitar $pull .
  2. Não use $pull . Carregue o objeto inteiro em um cliente e use findAndModify .