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 protected]"
  }
]

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

Typo Johnson
la source
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.

Nic Cottrell
la source
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.

Typo Johnson
la source
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é.

Dmitri
la source
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")
        ]
     }
}) 
mjwrazor
la source
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.

Anentropique
la source
4

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

db.foo.remove({**_id**: new ObjectId("4f872685a64eed5a980ca536")})
Karoy
la source
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")

SA Khan
la source
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

Yuval Meshorer
la source
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.

Asad S
la source
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é.

Bouse
la source