2011-11-22 19 views
149

He encontrado esta pregunta para C# y Perl, pero no en la interfaz nativa. Pensé que esto funcionaría:¿cómo busco un objeto por su ObjectId en la consola?

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

La consulta no hay ningún resultado. Encontré el 4ecbe7f9e8c1c9092c000027 haciendo db.theColl.find() y tomando 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 las encontré. ¿Es esto algo extraño de hacer? Me parece bastante normal.

Respuesta

235

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

documentación es here

> 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 } 
+1

extraño, me reinicia mi consola y de repente funcionó. ¿Hay alguna manera de cambiar tu "alcance" o algo en la línea de comandos y no realmente saberlo? – jcollum

+0

No es de extrañar: cuando busco 'find ObjectID' esa página no apareció: http://www.mongodb.org/dosearchsite.action?queryString=find+ObjectId&where=DOCS – jcollum

+0

Sí, es posible que haya escrito accidentalmente " use dbname "y bases de datos conmutadas. Supongo que no está utilizando la replicación ni la fragmentación, lo que obviamente crearía otras posibilidades de por qué no aparecía. –

56

Incluso más fácil, especialmente con la implementación del tabulador:

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

Editar: también funciona con el comando findOne para la salida más bonita.

+0

si queremos buscar con múltiples ID de objeto al igual que la forma en que implementamos WHERE en condición en mysql. – Pratswinz

+0

Esto me da un error: TypeError: filter debe ser una instancia de dict, bson.son.SON u otro tipo que herede colecciones. Asignación –

+1

@DavidOkwii: este ejemplo es para MongoShell. Parece que se está ejecutando desde Python, en cuyo caso querría hacer algo como: 'db.test.find ({'_ id': ObjectId ('4ecc05e55dd98a436ddcc47c')})' – MPlanchard

10

Te has perdido para insertar comillas dobles. La consulta exacta es

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

"El problema era que yo no estaba Estoy poniendo citas alrededor de mi _id ". - 7 de diciembre de 2011, ver los comentarios en la primera respuesta – jcollum

+0

@jcollum Como una actualización, la consulta que pones ahora sería válida sin las comillas alrededor de _id. – AnimalTesting

43

Si está usando 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 la nueva OBJECTID (ID), no es nuevo ID de objeto (id)

+1

estado sufriendo con este! tx –

-3

Basta con hacer :

db.getCollection('test').find('4ecbe7f9e8c1c9092c000027'); 
+0

Esto no funciona para mí de 'Mongo Shell' versión 3.2.7. – zatziky

+0

Eso solo coincidirá con un _id que es una cadena; si es un ObjectId verdadero, debe buscar utilizando la sintaxis de ObjectId. –

2

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

mirada a su mensaje de error y asegúrese de que no tiene ningún carácter especial copiados. Estaba consiguiendo el error

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

Cuando fui al carácter 43 que era sólo el comienzo de mi ID de objeto, después de las comillas abiertas, exactamente como lo pegué. Coloqué el cursor allí y golpeé el botón de retroceso. No parecía haber nada cuando debería haber eliminado la cita abierta. Golpeé nuevamente el espacio de retroceso y eliminé la cita abierta, luego volví a poner la cita y ejecuté la consulta, y funcionó, a pesar de parecer exactamente igual.

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

3

Una vez que haya abierto el CLI mongo, conectado y autorizado en la base de datos correcta.

The following example shows how to find the document with the _id=568c28fffc4be30d44d0398e from a collection called “products”:

db.products.find({"_id": ObjectId("568c28fffc4be30d44d0398e")}) 
0

Creo que es mejor escribir algo como esto:

db.getCollection('Blog').find({"_id":ObjectId("58f6724e97990e9de4f17c23")}) 
+0

¿Puede explicarme un poco cómo responde este código a la pregunta? –

0

Para utilizar OBJECTID método que no es necesario importarlo. Ya está en el objeto mongodb.

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

+1

No: 'TypeError: db.ObjectId no es una función' – jorisw

+0

Es solo' ObjectId ("ALGO") ' – Andy

Cuestiones relacionadas