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

MongoDB $pullAll


No MongoDB, você pode usar o $pullAll operador para remover todas as instâncias dos valores especificados de uma matriz existente.

Use $pullAll em conjunto com um método como update() , updateOne() , ou updateMany() para atualizar o(s) documento(s) especificado(s) com a alteração.

Exemplo


Suponha que temos uma coleção com os seguintes documentos:
{ "_id" : 1, "bar" : [ 1, 7, 2, 3, 8, 7, 1 ] }
{ "_id" : 2, "bar" : [ 0, 1, 8, 17, 18, 8 ] }
{ "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }

E digamos que queremos remover todos os valores de 7 da matriz no documento 1.

Nós podemos fazer isso:
db.foo.update( 
  { _id: 1 }, 
  { $pullAll: { bar: [ 7 ] } } 
)

Saída:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Essa mensagem nos diz que um documento correspondeu e um (ou seja, o mesmo documento) foi modificado.

Vejamos agora a coleção:
db.foo.find()

Resultado:
{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] }
{ "_id" : 2, "bar" : [ 0, 1, 8, 17, 18, 8 ] }
{ "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }

Podemos ver que o array no documento 1 teve todos os seus 7 valores removidos conforme especificado.

Remover vários valores


O argumento que fornecemos para $pullAll é uma matriz e, portanto, podemos remover vários valores separando-os com uma vírgula.

Exemplo:
db.foo.update( 
  { _id: 2 }, 
  { $pullAll: { bar: [ 17, 18 ] } } 
)

Saída:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Agora vamos verificar a coleção novamente:
db.foo.find()

Resultado:
{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] }
{ "_id" : 2, "bar" : [ 0, 1, 8, 8 ] }
{ "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }

Podemos ver que os valores 17 e 18 foram removidos da matriz no documento 2.

Atualizar todos os documentos


Você pode adicionar multi: true ou use o updateMany() método para atualizar todos os documentos que correspondem aos critérios.

Ao fazer isso, remova quaisquer critérios de seleção do primeiro documento de consulta (que especifica quais documentos devem ser atualizados). Em outras palavras, use um documento vazio como o primeiro argumento para o update() (ou updateMany() ) método.

Exemplo:
db.foo.update( 
  { }, 
  { $pullAll: { bar: [ 1, 8 ] } },
  { multi: true }
)

Saída:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })

Nesse caso, podemos ver que três documentos corresponderam (porque há três documentos na coleção) e todos os três foram modificados (porque todos continham os valores especificados).

Vamos verificar a coleção novamente:
db.foo.find()

Resultado:
{ "_id" : 1, "bar" : [ 2, 3 ] }
{ "_id" : 2, "bar" : [ 0 ] }
{ "_id" : 3, "bar" : [ 15, 11, 0, 3 ] }

Podemos ver que todas as instâncias foram atualizadas conforme especificado.