Supprimer par _id dans la console MongoDB


138

Dans la console MongoDB, comment puis-je supprimer un enregistrement par identifiant? Voici ma collection:

[ 
  {
     "_id" : { "$oid" : "4d512b45cc9374271b02ec4f" },
     "name" : "Gazza"
  },
  {
     "_id" : { "$oid" : "4d513345cc9374271b02ec6c" },
     "name" : "Dave",
     "adminOf" : { },
     "email" : "email@email.com"
  }
]

Et voici les commandes que j'ai essayées qui ne fonctionnent pas:

db.test_users.remove( {"_id":{"$oid":new ObjectId("4d512b45cc9374271b02ec4f")}});
db.test_users.remove( {"_id":{"$oid":"4d513345cc9374271b02ec6c"}});
db.test_users.remove( {"_id":"4d512b45cc9374271b02ec4f"});
db.test_users.remove( {"_id":new ObjectId("4d512b45cc9374271b02ec4f")});

La suppression par nom fonctionne:

db.test_users.remove( {"name":"Gazza"});

Ceci est dans le shell du navigateur sur mongodb.org si cela fait une différence

Merci


Aucune des solutions n'a fonctionné pour moi jusqu'à ce que j'aie ajouté un rappel: db.test_users.remove ({"_id": '4d512b45cc9374271b02ec4f'}, function (err, data) {});
rttmax

Réponses:


273

Très proche. Cela fonctionnera:

db.test_users.deleteOne( {"_id": ObjectId("4d512b45cc9374271b02ec4f")});

c'est-à-dire que vous n'avez pas besoin d'un nouveau pour ObjectId.

Notez également que dans certains pilotes / outils, remove()est désormais obsolète et deleteOne/ deleteManydoit être utilisé à la place.


4
il fonctionnera également sans guillemets autour de _id db.test_users.remove ({_id: ObjectId ("4d512b45cc9374271b02ec4f")});
alfonsodev

J'ai essayé ceci: TimeAndSpace.remove ({"_id": ObjectId ("8Bd2dZ778LXejYNrL")}); ... et j'ai obtenu, "Uncaught ReferenceError: ObjectId is not defined at <anonymous>: 2: 13"
B. Clay Shannon

@BClay L'ID de l'objet attend une entrée hexadécimale (peut-être aussi en minuscules) donc il échoue sur les caractères X, Z entre autres.
Nic Cottrell

2
C'est _reidicule.
Guy

Si le _idchamp n'est pas généré automatiquement (il est pas un ObjectId, mais une chaîne), vous pouvez simplement écrire la valeur de la _idsous guillemets: db.your.database.remove({"_id": "your value"}).
Aleksandar le

16

La réponse est que la console / shell Web de mongodb.org se comporte différemment et pas comme je m'y attendais. Une version installée à la maison fonctionnait parfaitement sans problème ie; le _id généré automatiquement sur le shell Web a été enregistré comme ceci:

"_id" : { "$oid" : "4d512b45cc9374271b02ec4f" },

La même configuration de document à la maison et le _id généré automatiquement ont été enregistrés comme ceci:

"_id" : ObjectId("4d5192665777000000005490")

Les requêtes ont fonctionné contre ce dernier sans problème.


1
Êtes-vous sûr qu'ils sont enregistrés différemment dans le document BSON? Ces différences semblent être le fait que le client formate simplement la sortie différemment.
Nic Cottrell

13

Eh bien, le _id est un objet dans votre exemple, il vous suffit donc de passer un objet

'db.test_users.remove({"_id": { "$oid" : "4d513345cc9374271b02ec6c" }})'

Cela devrait fonctionner

Edit: Ajout d'un paren de fin pour s'assurer qu'il est compilé.


J'ai essayé cela aussi, cela n'a pas supprimé l'enregistrement: db.test_users.remove ({"_id": {"$ oid": "4d513345cc9374271b02ec6c"}}); ps: a mis à jour la question pour le montrer
Typo Johnson

Dans votre question, vous avez dit que vous aviez essayé ceci: db.test_users.remove ({"_id": {"$ oid": new ObjectId ("4d512b45cc9374271b02ec4f")}});
Dmitri

Oui, j'ai mis à jour la question tout à l'heure merci, j'ai essayé les deux et aucun travail. C'est peut-être parce que vous ne pouvez pas supprimer sur une sous-propriété?
Typo Johnson

en utilisant cette méthode renvoie «opérateur inconnu: $ oid»
Arman Ortega

13

Si vous souhaitez supprimer par une liste d'identifiants, cela fonctionne très bien.

db.CollectionName.remove({
    "_id": {
        $in: [
            ObjectId("0930292929292929292929"),
            ObjectId("0920292929292929292929")
        ]
     }
}) 

6

Avez-vous plusieurs nœuds mongodb dans un jeu de réplicas?

J'ai trouvé (j'utilise via Robomongo gui mongo shell, je suppose qu'il en va de même dans d'autres cas) que la syntaxe de suppression correcte, c'est-à-dire

db.test_users.remove({"_id": ObjectId("4d512b45cc9374271b02ec4f")})

... ne fonctionne que si vous êtes connecté au nœud principal du jeu de réplicas.


4

Je viens de tomber sur cela moi-même et cette variante a fonctionné pour moi:

db.foo.remove({**_id**: new ObjectId("4f872685a64eed5a980ca536")})

4

obtenez d'abord la fonction ObjectID à partir du mongodb ObjectId = require (mongodb) .ObjectID;

alors vous pouvez appeler le _id avec la fonction de suppression

"_id": ObjectId ("4d5192665777000000005490")


2

Même si ce message est obsolète, collection.remove est obsolète! collection.delete_onedevrait être utilisé à la place!

Plus d'informations peuvent être trouvées ici sous #remove


1

Supposons que nous ayons cette collection factice:

{ "_id" : ObjectId("5ea53fedaa79db20d4e14284"), "item" : "planner", "qty" : 75 }

utilisez simplement:

db.inventory.deleteOne({ _id: ObjectId("5ea53fedaa79db20d4e14284") })

il sera supprimé avec ceci en réponse:

{ "acknowledged" : true, "deletedCount" : 1 }

C'est tout.


0

Solution et exemple:

1- C: \ MongoDB \ Server \ 3.2 \ bin> mongo (n'émettez pas encore de commande car vous n'êtes encore connecté à aucune base de données, vous n'êtes connecté qu'au serveur de base de données mongodb).

2-

show dbs analytics_database 0,000 Go local 0,000 Go test_database 0,000 Go

3-

utiliser test_database basculé sur db test_database

4-

db.Collection.remove ({"_ id": ObjectId ("5694a3590f6d451c1500002e")}, 1); WriteResult ({"nRemoved": 1})

maintenant vous voyez que WriteResult ({"nRemoved": 1}) est 1 et non 0.

Terminé.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.