¿Cómo busco un objeto por su ObjectId en la consola mongo?

265

He encontrado esta pregunta respondida para C # y Perl, pero no en la interfaz nativa. Pensé que esto funcionaría:

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

La consulta no devolvió resultados. Encontré el 4ecbe7f9e8c1c9092c000027 haciendo db.theColl.find()y agarrando un ObjectId. Hay varios miles de objetos en esa colección.

He leído todas las páginas que pude encontrar en el sitio web mongodb.org y no lo encontré. ¿Es esto algo extraño? Me parece bastante normal.

jcollum
fuente

Respuestas:

417

No es extraño en absoluto, la gente hace esto todo el tiempo. Asegúrese de que el nombre de la colección sea correcto (el caso es importante) y que el ObjectId sea exacto.

La documentación está aquí

> 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
fuente
1
Extraño, reinicié mi consola y de repente funcionó. ¿Hay alguna forma de cambiar su "alcance" o algo en la línea de comando y no saberlo realmente?
jcollum
No es de extrañar: cuando busqué
jcollum
1
Sí, podría haber escrito accidentalmente "use dbname" y haber cambiado de base de datos. Supongo que no está utilizando replicación o fragmentación, lo que obviamente crearía otras posibilidades de por qué no aparecía.
Tyler Brock
1
El problema era que no estaba poniendo citas alrededor de mi _id.
jcollum
9
Wow, no tenía idea de que esto era algo especial en MongoDB. Perdí un poco de tiempo pensando que mi problema estaba en otra parte, pero encontrarlo solo requería reglas adicionales. para lo que vale, las personas que usan express y node necesitarán requerir ObjectId exp ... var ObjectId = require ('mongodb'). ObjectID;
Chris Hawkes
87

Si está utilizando 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})

Editar: corregido a nuevo ObjectId (id), no nuevo ObjectID (id)

Mustafa Deniz
fuente
55
import { ObjectId } from "mongodb";trabaja para el más elegante JS.
NetOperator Wibby
84

Aún más fácil, especialmente con la finalización de pestañas:

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

Editar: también funciona con el findOnecomando para una salida más bonita.

MPlanchard
fuente
si queremos buscar con múltiples ID de objeto al igual que la forma en que implementamos la condición WHERE IN en mysql.
Pratswinz
Esto me da un error: TypeError: filter debe ser una instancia de dict, bson.son.SON u otro tipo que herede de las colecciones
Mapa
1
@DavidOkwii: este ejemplo es para MongoShell. Parece que estás corriendo desde Python, en cuyo caso te gustaría hacer algo como:db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
MPlanchard
Esto es incorrecto, el uso de este enfoque en un db.test.findOneAndDelete(ObjectId('57eujhs76e7hs877e868'))comando eliminará un documento incluso si el ObjectId no coincide con la identificación especificada. db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
Debe
1
Esta pregunta era sobre find(), no sobre findOneAndDelete().
MPlanchard
18

Has perdido insertar comillas dobles. La consulta exacta es

db.theColl.find( { "_id": ObjectId("4ecbe7f9e8c1c9092c000027") } )
Mohamed Abdullah J
fuente
"El problema era que no estaba poniendo citas alrededor de mi _id". - 7 de diciembre de 2011, ver los comentarios sobre la primera respuesta
jcollum
@jcollum Como actualización, la consulta que realice ahora sería válida sin las comillas alrededor de _id.
AnimalTesting
4

Si está trabajando en el shell mongo, consulte esto: Respuesta de Tyler Brock

Escribí la respuesta si estás usando mongodb usando node.js

No es necesario convertir la identificación en un ObjectId. Solo usa :

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

Este método de recopilación convertirá automáticamente la identificación en ObjectId.

Por otra parte :

db.collection.findOne({"_id":'4ecbe7f9e8c1c9092c000027'})No funciona como se esperaba. Has convertido manualmente la identificación a ObjectId.

Eso se puede hacer así:

let id = '58c85d1b7932a14c7a0a320d';

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

db.collection.findOne({"_id":o_id});
saurabh gupta
fuente
findById debería ser una función / método de mangosta, donde internamente convierte la cadena en ObjectId, a menos que use mangosta, ¡este código no lo ayuda si es un nodo u otro ...!
whoami
1
yes..i olvidó mencionar es necesario que mangosta ..... gracias por la corrección
Gupta Saurabh
3

Acabo de tener este problema y estaba haciendo exactamente lo que estaba documentado y todavía no funcionaba.

Mire su mensaje de error y asegúrese de que no tiene ningún carácter especial copiado. Recibí el error

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

Cuando pasé al carácter 43, era solo el comienzo de mi ID de objeto, después de las comillas abiertas, exactamente como lo pegué. Puse mi cursor allí y presioné la tecla de retroceso. Nada parecía suceder cuando debería haber eliminado la comilla abierta. Presioné la tecla de retroceso nuevamente y eliminé la cita abierta, luego volví a poner la cita y ejecuté la consulta y funcionó, a pesar de verse exactamente igual.

Estaba haciendo desarrollo en WebMatrix y copié la identificación del objeto de la consola. Cada vez que copie desde la consola en WebMatrix, es probable que elija algunos caracteres invisibles que causarán errores.

Patrick Graham
fuente
3

Una vez que abrió la CLI de mongo, se conectó y autorizó en la base de datos correcta.

El siguiente ejemplo muestra cómo encontrar el documento con _id = 568c28fffc4be30d44d0398e de una colección llamada "productos":

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

En las funciones de MongoDB Stitch se puede hacer usando BSON como a continuación:

Utilice el ObjectIdayudante en el paquete de utilidad BSON para este propósito, como en el siguiente ejemplo:

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

Creo que es mejor que escribas algo como esto:

db.getCollection('Blog').find({"_id":ObjectId("58f6724e97990e9de4f17c23")})
mina_anwer
fuente
¿Puedes explicar un poco cómo este código responde la pregunta?
Ḟḹáḿíṅḡ Ⱬỏḿƀíé
-1

Para usar el método Objectid no necesita importarlo. Ya está en el objeto mongodb.

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

Miguel Peguero
fuente
1
Nop:TypeError: db.ObjectId is not a function
jorisw
Es soloObjectId("SOMETHING")
Ben Sinclair
-1

Si está utilizando Node.js:

En ese req.user está el formato 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
fuente
-5

Simplemente haz:

db.getCollection('test').find('4ecbe7f9e8c1c9092c000027');
Shalabh Raizada
fuente
Esto no funciona para mí desde la Mongo Shellversión 3.2.7.
Amio.io
1
Eso solo coincidirá con un _id que es una cadena; si se trata de un ObjectId verdadero, debe buscar utilizando la sintaxis ObjectId.
Vince Bowdren