153 votes

Suppression par _id dans la console MongoDB

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 et 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"});

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

Merci

0 votes

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

0 votes

Je suis curieux de savoir comment vous avez réussi à écrire ces documents dans votre collection, ma tentative s'est terminée par "writeError" : { "code" : 52, "errmsg" : "$oid n'est pas valide pour le stockage". }

295voto

Nic Cottrell Points 1461

Très proche. Ça va marcher :

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

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

Notez également que dans certains pilotes/outils, remove() est maintenant déprécié et deleteOne o deleteMany doit être utilisé à la place.

4 votes

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

0 votes

J'ai essayé ceci : TimeAndSpace.remove( {"_id" : ObjectId("8Bd2dZ778LXejYNrL")}) ; ...et j'ai obtenu "Uncaught ReferenceError : ObjectId n'est pas défini à <anonymous>:2:13"

0 votes

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

16voto

Typo Johnson Points 1959

La réponse est que la console/shell web de mongodb.org se comporte différemment et pas comme je l'attendais. Une version installée chez moi fonctionnait parfaitement sans problème, c'est-à-dire que l'_id généré automatiquement dans le shell web était enregistré comme ceci :

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

Le même document configuré à la maison et l'_id généré automatiquement a été enregistré comme suit :

"_id" : ObjectId("4d5192665777000000005490")

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

1 votes

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

16voto

mjwrazor Points 792

Si vous souhaitez supprimer par une liste d'identifiants, cela fonctionne parfaitement.

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

14voto

Dmitri Points 1952

Eh bien, l'_id est un objet dans votre exemple, donc vous avez juste besoin de passer un objet

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

Cela devrait fonctionner

Edit : Ajouté le paren de fin pour s'assurer qu'il compile.

0 votes

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

0 votes

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

0 votes

Oui, j'ai mis à jour la question à l'instant, merci. J'ai essayé les deux et aucun ne fonctionne. Peut-être est-ce parce que vous ne pouvez pas supprimer une propriété secondaire ?

6voto

Anentropic Points 7751

Avez-vous plusieurs nœuds mongodb dans un ensemble de répliques ?

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

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

...ne fonctionne pas si vous n'êtes pas connecté à l'Internet. primaire nœud de l'ensemble de répliques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X