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

MongoDB $ pull


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.