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:- Mude sua estrutura para que você possa aproveitar
$pull
. - Não use
$pull
. Carregue o objeto inteiro em um cliente e usefindAndModify
.