Comment rechercher un objet par son ObjectId dans la console mongo?

265

J'ai trouvé une réponse à cette question pour C # et Perl, mais pas dans l'interface native. Je pensais que cela fonctionnerait:

db.theColl.find( { _id: ObjectId("4ecbe7f9e8c1c9092c000027") } )

La requête n'a renvoyé aucun résultat. J'ai trouvé le 4ecbe7f9e8c1c9092c000027 en faisant db.theColl.find()et en saisissant un ObjectId. Il y a plusieurs milliers d'objets dans cette collection.

J'ai lu toutes les pages que j'ai pu trouver sur le site mongodb.org et je ne les ai pas trouvées. Est-ce juste une chose étrange à faire? Cela me semble assez normal.

jcollum
la source

Réponses:

417

Pas étrange du tout, les gens font ça tout le temps. Assurez-vous que le nom de la collection est correct (la casse importe) et que l'ObjectId est exact.

La documentation est ici

> db.test.insert({x: 1})

> db.test.find()                                               // no criteria
{ "_id" : ObjectId("4ecc05e55dd98a436ddcc47c"), "x" : 1 }      

> db.test.find({"_id" : ObjectId("4ecc05e55dd98a436ddcc47c")}) // explicit
{ "_id" : ObjectId("4ecc05e55dd98a436ddcc47c"), "x" : 1 }

> db.test.find(ObjectId("4ecc05e55dd98a436ddcc47c"))           // shortcut
{ "_id" : ObjectId("4ecc05e55dd98a436ddcc47c"), "x" : 1 }
Tyler Brock
la source
1
Étrange, j'ai redémarré ma console et ça a soudainement fonctionné. Existe-t-il un moyen de modifier votre "portée" ou quelque chose sur la ligne de commande sans vraiment le savoir?
jcollum
Pas étonnant: lorsque je recherche «find ObjectID», cette page n'est pas apparue: mongodb.org/…
jcollum
1
Ouais, vous avez peut-être accidentellement tapé "use dbname" et changé de base de données. Je suppose que vous n'utilisez pas de réplication ou de partitionnement, ce qui créerait évidemment d'autres possibilités pour lesquelles il n'apparaissait pas.
Tyler Brock
1
Le problème était que je ne mettais pas de guillemets autour de mon _id.
jcollum
9
Wow, je ne savais pas que c'était quelque chose de spécial dans MongoDB perdu un peu de temps à penser que mon problème était ailleurs, mais le trouver nécessitait simplement des règles supplémentaires. pour ce que ça vaut, les personnes utilisant express et node devront exiger ObjectId exp ... var ObjectId = require ('mongodb'). ObjectID;
Chris Hawkes
87

Si vous utilisez Node.js:

> var ObjectId = require('mongodb').ObjectId; 
> var id = req.params.gonderi_id;       
> var o_id = new ObjectId(id);
> db.test.find({_id:o_id})

Modifier: corrigé en nouvel ObjectId (id), pas en nouveau ObjectID (id)

Mustafa Deniz
la source
5
import { ObjectId } from "mongodb";travaille pour l'amateur JS.
NetOperator Wibby
84

Encore plus facile, surtout avec la complétion des onglets:

db.test.find(ObjectId('4ecc05e55dd98a436ddcc47c'))

Edit: fonctionne également avec la findOnecommande pour une sortie plus jolie.

MPlanchard
la source
si nous voulons rechercher avec plusieurs ID d'objet, tout comme la façon dont nous implémentons la condition WHERE IN dans mysql.
Pratswinz
Cela me donne une erreur: TypeError: le filtre doit être une instance de dict, bson.son.SON ou d'un autre type qui hérite des collections
Cartographie
1
@DavidOkwii - cet exemple concerne le MongoShell. Il semble que vous exécutiez depuis Python, auquel cas vous voudriez faire quelque chose comme:db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
MPlanchard
C'est faux, l'utilisation de cette approche dans une db.test.findOneAndDelete(ObjectId('57eujhs76e7hs877e868'))commande supprimera un document même si l'ObjectId ne correspond pas à l'ID spécifié. Vous devez spécifier précisément comme cecidb.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
Danny Sofftie
1
Cette question portait sur find(), pas sur findOneAndDelete().
MPlanchard
18

Vous avez manqué d'insérer des guillemets doubles. La requête exacte est

db.theColl.find( { "_id": ObjectId("4ecbe7f9e8c1c9092c000027") } )
Mohamed Abdullah J
la source
"Le problème était que je ne mettais pas de guillemets autour de mon _id." - 7 décembre 2011, voir les commentaires sur la première réponse
jcollum
@jcollum En tant que mise à jour, la requête que vous mettez maintenant serait valide sans les guillemets autour de _id.
AnimalTesting
4

Si vous travaillez sur la coquille de mongo, veuillez vous référer à ceci: Réponse de Tyler Brock

J'ai écrit la réponse si vous utilisez mongodb en utilisant node.js

Vous n'avez pas besoin de convertir l'id en un ObjectId. Utilisez simplement:

db.collection.findById('4ecbe7f9e8c1c9092c000027');

cette méthode de collecte convertira automatiquement id en ObjectId.

D'autre part :

db.collection.findOne({"_id":'4ecbe7f9e8c1c9092c000027'})ne fonctionne pas comme prévu. Vous avez converti manuellement l'identifiant enObjectId .

Cela peut se faire comme ceci:

let id = '58c85d1b7932a14c7a0a320d';

let o_id = new ObjectId(id);   // id as a string is passed

db.collection.findOne({"_id":o_id});
saurabh gupta
la source
findById devrait être une fonction / méthode de mangouste - où il convertit en interne une chaîne en ObjectId, à moins que vous n'utilisiez mangouste ce code ne vous aide pas que ce soit un nœud ou autre .. !!
whoami
1
oui..j'ai oublié de mentionner que la mangouste est obligatoire ..... merci pour la correction
saurabh gupta
3

Je viens d'avoir ce problème et je faisais exactement ce qui était documenté et cela ne fonctionnait toujours pas.

Examinez votre message d'erreur et assurez-vous de ne pas copier de caractères spéciaux. J'obtenais l'erreur

SyntaxError: illegal character @(shell):1:43

Lorsque je suis allé au caractère 43, ce n'était que le début de mon ID d'objet, après les guillemets ouverts, exactement comme je l'ai collé. J'ai frappé à nouveau en arrière et il a supprimé la citation ouverte, puis j'ai remis la citation et exécuté la requête et cela a fonctionné, malgré la même apparence.

Je faisais du développement dans WebMatrix et j'ai copié l'ID d'objet à partir de la console. Chaque fois que vous copiez à partir de la console dans WebMatrix, vous êtes susceptible de détecter des caractères invisibles qui provoqueront des erreurs.

Patrick Graham
la source
3

Une fois que vous avez ouvert la CLI mongo, connecté et autorisé sur la bonne base de données.

L'exemple suivant montre comment rechercher le document avec le _id = 568c28fffc4be30d44d0398e dans une collection appelée «produits»:

db.products.find({"_id": ObjectId("568c28fffc4be30d44d0398e")})
Oliver Wolf
la source
2

Dans les fonctions MongoDB Stitch, cela peut être fait en utilisant BSON comme ci-dessous:

Utilisez l' ObjectIdassistant du package d'utilitaires BSON à cet effet, comme dans l'exemple suivant:

var id = "5bb9e9f84186b222c8901149";  
BSON.ObjectId(id);
kushal.8
la source
1

Je pense que tu ferais mieux d'écrire quelque chose comme ça:

db.getCollection('Blog').find({"_id":ObjectId("58f6724e97990e9de4f17c23")})
mina_anwer
la source
Pouvez-vous expliquer un peu comment ce code répond à la question?
Ḟḹáḿíṅḡ Ⱬỏḿƀíé
-1

Pour utiliser la méthode Objectid, vous n'avez pas besoin de l'importer. C'est déjà sur l'objet mongodb.

var ObjectId = new db.ObjectId('58c85d1b7932a14c7a0a320d');
db.yourCollection.findOne({ _id: ObjectId }, function (err, info) {
   console.log(info)
});
               

Miguel Peguero
la source
1
Non:TypeError: db.ObjectId is not a function
jorisw
C'est justeObjectId("SOMETHING")
Ben Sinclair
-1

Si vous utilisez Node.js:

Dans ce req.user est le format ObjectId.

var mongoose = require("mongoose");
var ObjectId = mongoose.Schema.Types.ObjectId;

function getUsers(req, res)
    User.findOne({"_id":req.user}, { password: 0 }) 
         .then(data => { 
             res.send(data);})g
}
exports.getUsers = getUsers;
Denish Kukadiya
la source
-5

Faites simplement:

db.getCollection('test').find('4ecbe7f9e8c1c9092c000027');
Shalabh Raizada
la source
Cela ne fonctionne pas pour moi à partir de la Mongo Shellversion 3.2.7.
Amio.io
1
Cela ne correspondra qu'à un _id qui est une chaîne; s'il s'agit d'un vrai ObjectId, vous devez effectuer une recherche à l'aide de la syntaxe ObjectId.
Vince Bowdren