MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB findOneAndDelete()

Dans MongoDB, le db.collection.findOneAndDelete() La méthode supprime un seul document et renvoie le document supprimé.

Il supprime le premier document correspondant dans la collection qui correspond au filter . Le sort Le paramètre peut être utilisé pour influencer le document à supprimer.

La collection part est le nom de la collection avec laquelle supprimer le document.

Exemple

Supposons que nous ayons une collection appelée pets qui contient les documents suivants :

{ "_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" ] }

Nous pouvons utiliser le db.collection.findOneAndDelete() méthode pour supprimer l'un de ces documents.

db.pets.findOneAndDelete(
   { "type": "Cat" }
)

Résultat :

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

Dans ce cas, j'ai utilisé une requête pour la restreindre aux seuls chats. Un seul chat a été supprimé, même s'il y a deux chats dans la collection.

Vérifions la collection.

db.pets.find()

Résultat :

{ "_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" ] }

Nous pouvons voir que le premier chat (document 3) a été supprimé.

Documents intégrés

Si vous avez des documents qui contiennent des documents incorporés, vous pouvez utiliser les méthodes suivantes pour interroger les données dans les documents incorporés.

  • Notation par points (par exemple, field.nestedfield: <value> )
  • Formulaire imbriqué (par exemple, { field: { nestedfield: <value> } } ). Notez que cette option n'est disponible qu'à partir de MongoDB 4.4.

Voici un exemple qui utilise la notation par points pour effectuer une requête dans le document intégré.

db.pets.findOneAndDelete({ "specs.height": 400 })

Résultat :

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

Comme prévu, le document 6 a été supprimé.

La requête suivante supprime le même document, mais dans ce cas, elle utilise un formulaire imbriqué pour faire référence au document incorporé.

db.pets.findOneAndDelete({ 
    "specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
 })

Lors de l'utilisation du formulaire imbriqué, la requête doit correspondre exactement à l'ensemble du document intégré. Par exemple, la requête suivante ne correspond pas :

db.pets.findOneAndDelete({ 
    "specs" : {
		"height" : 400
	}
 })

Résultat :

null

Tableaux

Vous pouvez référencer des données dans des tableaux en référençant l'élément du tableau par son index ou par sa valeur.

Si nous voulions supprimer tous les chiens avec le prix Top Dog, nous pourrions écrire la requête suivante (qui renverra le chien ci-dessus).

db.pets.findOneAndDelete({ 
    "awards": "Top Dog"
})

Résultat :

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

Vous pouvez également spécifier l'index de l'élément, comme ceci :

db.pets.findOneAndDelete({ 
    "awards.0": "Top Dog"
})

Cela nécessite que la valeur spécifiée soit à l'index spécifié. Par conséquent, la requête suivante ne renvoie pas le même chien.

db.pets.findOneAndDelete({ 
    "awards.1": "Top Dog"
})

Notez que les tableaux sont basés sur zéro, donc un index de 0 spécifie le premier élément, 1 spécifie le deuxième élément, et ainsi de suite.

Le sort Paramètre

Vous pouvez utiliser le sort paramètre pour spécifier un ordre de tri pour les documents correspondant au filter . Cela déterminera quel document sera supprimé.

Lors de l'utilisation du sort paramètre, une valeur de 1 trie les documents par ordre croissant, et une valeur de -1 les trie par ordre décroissant.

L'argument doit être fourni sous forme de document. Par exemple, { sort: { "salary": 1 } } trie par le salary champ par ordre croissant.

Par exemple, supposons que nous créons une collection appelée employees avec les documents suivants :

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 }
    ])

Nous pourrions exécuter le code suivant pour trouver des documents avec un salaire inférieur à 60 000, puis supprimer celui qui est le plus bas parmi ces documents.

db.employees.findOneAndDelete(
   { "salary": { $lt: 60000 } },
   {
       sort: { "salary": 1 }
    }
)

Résultat :

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

Comme prévu, l'employé avec le salaire le plus bas a été supprimé.

Voici à quoi ressemblent les documents maintenant.

db.employees.find()

Résultat :

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

Nous pouvons donc voir que Fritz a été supprimé.

Revenons au document d'origine.

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 }
    ])

Exécutons maintenant le même findOneAndDelete() code à nouveau, mais cette fois nous allons le trier par ordre décroissant.

db.employees.findOneAndDelete(
   { "salary": { $lt: 60000 } },
   {
       sort: { "salary": -1 }
    }
)

Résultat :

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

Cette fois, Sandy a été supprimée.

Vérifions à nouveau la collection.

db.employees.find()

Résultat :

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

Comme prévu, Sandy n'est plus dans la collection.

Plus d'informations

Le db.collection.findOneAndDelete() la méthode accepte également d'autres paramètres, tels que projection (pour spécifier un sous-ensemble de champs à renvoyer), maxTimeMS , et collation .

Consultez la documentation MongoDB pour plus d'informations.