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

MongoDB findOneAndDelete()


No MongoDB o db.collection.findOneAndDelete() O método exclui um único documento e retorna o documento excluído.

Ele exclui o primeiro documento correspondente na coleção que corresponde ao filter . A sort pode ser usado para influenciar qual documento é excluído.

A collection parte é o nome da coleção da qual excluir o documento.

Exemplo


Suponha que tenhamos uma coleção chamada pets que contém os seguintes documentos:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }

Podemos usar o db.collection.findOneAndDelete() método para excluir um desses documentos.
db.pets.findOneAndDelete(
   { "type": "Cat" }
)

Resultado:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

Nesse caso, usei uma consulta para reduzi-la a apenas gatos. Apenas um gato foi excluído, embora existam dois gatos na coleção.

Vamos conferir a coleção.
db.pets.find()

Resultado:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }

Podemos ver que o primeiro gato (documento 3) foi excluído.

Documentos incorporados


Se você tiver documentos que contenham documentos incorporados, poderá usar os métodos a seguir para consultar dados nos documentos incorporados.
  • Notação de ponto (por exemplo, field.nestedfield: <value> )
  • Formulário aninhado (por exemplo, { field: { nestedfield: <value> } } ). Observe que esta opção está disponível apenas no MongoDB 4.4.

Aqui está um exemplo que usa a notação de ponto para consultar dentro do documento incorporado.
db.pets.findOneAndDelete({ "specs.height": 400 })

Resultado:
{
	"_id" : 6,
	"name" : "Fetch",
	"type" : "Dog",
	"specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
}

Como esperado, o documento 6 foi excluído.

A consulta a seguir exclui o mesmo documento, mas, nesse caso, usa o formulário aninhado para se referir ao documento incorporado.
db.pets.findOneAndDelete({ 
    "specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
 })

Ao usar o formulário aninhado, a consulta deve corresponder exatamente a todo o documento incorporado. Por exemplo, a consulta a seguir não corresponde:
db.pets.findOneAndDelete({ 
    "specs" : {
		"height" : 400
	}
 })

Resultado:
null

Matrizes


Você pode fazer referência a dados em matrizes referenciando o elemento da matriz por seu índice ou por seu valor.

Se quisermos excluir todos os cães com o prêmio Top Dog, poderíamos escrever a seguinte consulta (que retornará o cão acima).
db.pets.findOneAndDelete({ 
    "awards": "Top Dog"
})

Resultado:
{
	"_id" : 7,
	"name" : "Jake",
	"type" : "Dog",
	"awards" : [
		"Top Dog",
		"Best Dog",
		"Biggest Dog"
	]
}

Você também pode especificar o índice do elemento, assim:
db.pets.findOneAndDelete({ 
    "awards.0": "Top Dog"
})

Fazer isso requer que o valor especificado esteja no índice especificado. Portanto, a consulta a seguir não retorna o mesmo cão.
db.pets.findOneAndDelete({ 
    "awards.1": "Top Dog"
})

Observe que as matrizes são baseadas em zero, portanto, um índice de 0 especifica o primeiro elemento, 1 especifica o segundo elemento e assim por diante.

A sort Parâmetro


Você pode usar o sort parâmetro para especificar uma ordem de classificação para os documentos correspondidos pelo filter . Isso influenciará qual documento será excluído.

Ao usar o sort parâmetro, um valor de 1 classifica os documentos em ordem crescente e um valor de -1 classifica-os em ordem decrescente.

O argumento precisa ser fornecido como um documento. Por exemplo, { sort: { "salary": 1 } } classifica pelo salary campo em ordem crescente.

Por exemplo, suponha que criamos uma coleção chamada employees com os seguintes documentos:
db.employees.insertMany([
    { _id: 1, name: "Sandy", salary: 55000 },
    { _id: 2, name: "Sarah", salary: 128000 },
    { _id: 3, name: "Fritz", salary: 25000 },
    { _id: 4, name: "Chris", salary: 45000 },
    { _id: 5, name: "Beck", salary: 82000 }
    ])

Poderíamos executar o código a seguir para encontrar documentos com um salário inferior a 60.000 e, em seguida, excluir o menor desses documentos.
db.employees.findOneAndDelete(
   { "salary": { $lt: 60000 } },
   {
       sort: { "salary": 1 }
    }
)

Resultado:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }

Como esperado, o funcionário com o menor salário foi excluído.

Veja como estão os documentos agora.
db.employees.find()

Resultado:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Assim, podemos ver que Fritz foi excluído.

Vamos reverter para o documento original.
db.employees.remove({})
db.employees.insertMany([
    { _id: 1, name: "Sandy", salary: 55000 },
    { _id: 2, name: "Sarah", salary: 128000 },
    { _id: 3, name: "Fritz", salary: 25000 },
    { _id: 4, name: "Chris", salary: 45000 },
    { _id: 5, name: "Beck", salary: 82000 }
    ])

Agora vamos executar o mesmo findOneAndDelete() código novamente, mas desta vez vamos classificá-lo em ordem decrescente.
db.employees.findOneAndDelete(
   { "salary": { $lt: 60000 } },
   {
       sort: { "salary": -1 }
    }
)

Resultado:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }

Desta vez, Sandy foi excluído.

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

Resultado:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Como esperado, Sandy não está mais na coleção.

Mais informações


O db.collection.findOneAndDelete() O método também aceita outros parâmetros, como projection (para especificar um subconjunto de campos a serem retornados), maxTimeMS , e collation .

Consulte a documentação do MongoDB para obter mais informações.