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.