No MongoDB, você pode usar o
$pull
operador para remover valores de uma matriz. Use
$pull
em conjunto com um método como update()
para atualizar o documento especificado com a alteração. Exemplo
Suponha que tenhamos uma coleção chamada
products
com os seguintes documentos:{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Podemos remover um elemento do array no documento 1 assim:
db.products.update(
{ _id: 1 },
{ $pull: { sizes: "XXL" } }
)
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.products.find()
Resultado:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Podemos ver que o array no documento 1 teve seu valor
XXL
removido conforme especificado. Remover vários valores
Podemos usar o
$in
operador para especificar vários valores que queremos remover da matriz. Exemplo:
db.products.update(
{ _id: 3 },
{ $pull: { sizes: { $in: ["XS", "XL"] } } }
)
Saída:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Agora vamos verificar a coleção novamente:
db.products.find()
Resultado:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Podemos ver que os dois elementos especificados foram removidos do array no documento 3.
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.products.update(
{ },
{ $pull: { sizes: "XL" } },
{ multi: true }
)
Saída:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
Neste caso, podemos ver que três documentos corresponderam (porque existem três documentos na coleção), mas apenas dois foram modificados (porque apenas dois tinham o valor
XL
nos sizes
variedade). E reveja a coleção:
db.products.find()
Resultado:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Podemos ver que todas as instâncias de
XL
foram removidos de todos os documentos da coleção. Matriz de Documentos
Se você tiver uma matriz que contenha documentos como seus elementos, poderá remover qualquer um desses documentos especificando critérios que correspondam aos dados dentro do documento.
Suponha que tenhamos uma coleção chamada restaurantes que os seguintes documentos:
{ "_id" : 1, "name" : "The Rat", "reviews" : [ { "name" : "Stanley", "date" : "04 December, 2020", "ordered" : "Dinner", "rating" : 1 }, { "name" : "Tom", "date" : "04 October, 2020", "ordered" : "Lunch", "rating" : 2 } ] } { "_id" : 2, "name" : "Yum Palace", "reviews" : [ { "name" : "Stacey", "date" : "08 December, 2020", "ordered" : "Lunch", "rating" : 3 }, { "name" : "Tom", "date" : "08 October, 2020", "ordered" : "Breakfast", "rating" : 4 } ] } { "_id" : 3, "name" : "Boardwalk Cafe", "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "ordered" : "Breakfast", "rating" : 5 }, { "name" : "Lisa", "date" : "25 October, 2020", "ordered" : "Dinner", "rating" : 5 }, { "name" : "Kim", "date" : "21 October, 2020", "ordered" : "Dinner", "rating" : 5 } ] }
Nesse caso, o campo chamado
reviews
contém uma série de documentos. Cada documento é uma avaliação diferente do restaurante em questão. Poderíamos usar
$pull
para remover comentários que correspondam a determinados critérios. Exemplo:
db.restaurants.update(
{ },
{ $pull: { reviews: { rating: { $lt: 4 } } } },
{ multi: true }
)
Saída:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
Esta mensagem nos diz que três documentos corresponderam aos critérios de consulta (porque selecionamos todos os documentos) e dois documentos foram modificados (porque dois corresponderam ao nosso
$pull
critério). Vamos verificar a coleção novamente para ver o efeito:
db.restaurants.find().pretty()
Resultado:
{ "_id" : 1, "name" : "The Rat", "reviews" : [ ] } { "_id" : 2, "name" : "Yum Palace", "reviews" : [ { "name" : "Tom", "date" : "08 October, 2020", "ordered" : "Breakfast", "rating" : 4 } ] } { "_id" : 3, "name" : "Boardwalk Cafe", "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "ordered" : "Breakfast", "rating" : 5 }, { "name" : "Lisa", "date" : "25 October, 2020", "ordered" : "Dinner", "rating" : 5 }, { "name" : "Kim", "date" : "21 October, 2020", "ordered" : "Dinner", "rating" : 5 } ] }
Podemos ver que apenas os comentários com uma classificação de 4 e acima permanecem. Todos os comentários com menos de 4 foram removidos.