Como pesquiso um objeto por seu ObjectId no console do mongo?

265

Eu encontrei esta pergunta respondida para C # e Perl, mas não na interface nativa. Eu pensei que isso iria funcionar:

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

A consulta não retornou resultados. Encontrei o 4ecbe7f9e8c1c9092c000027 fazendo db.theColl.find()e pegando um ObjectId. Existem vários milhares de objetos nessa coleção.

Eu li todas as páginas que pude encontrar no site mongodb.org e não as encontrei. Isso é apenas uma coisa estranha a se fazer? Parece-me bastante normal.

jcollum
fonte

Respostas:

417

Não é nada estranho, as pessoas fazem isso o tempo todo. Verifique se o nome da coleção está correto (é importante) e se o ObjectId é exato.

A documentação está aqui

> 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
fonte
1
Estranho, reiniciei meu console e de repente funcionou. Existe alguma maneira de mudar seu "escopo" ou algo na linha de comando e realmente não saber?
Jcollum
Não é de admirar: quando eu procuro 'find ObjectID', essa página não aparece: mongodb.org/…
jcollum
1
Sim, você pode ter digitado acidentalmente "use dbname" e alternado os bancos de dados. Suponho que você não esteja usando replicação ou sharding, o que obviamente criaria outras possibilidades de por que não estava aparecendo.
Tyler Brock
1
O problema era que eu não estava colocando aspas no meu _id.
Jcollum
9
Uau, eu não sabia que isso era algo especial no MongoDB, perdi um pouco de tempo pensando que meu problema estava em outro lugar, mas encontrá-lo exigia apenas regras adicionais. pelo que vale a pena as pessoas que usam express e node precisarão de ObjectId exp ... var ObjectId = require ('mongodb'). ObjectID;
Chris Hawkes
87

Se você estiver usando o 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: corrigido para o novo ObjectId (id), não para o novo ObjectID (id)

Mustafa Deniz
fonte
5
import { ObjectId } from "mongodb";trabalha para JS mais sofisticado.
NetOperator Wibby
84

Ainda mais fácil, especialmente com o preenchimento de guias:

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

Editar: também funciona com o findOnecomando para obter uma saída mais bonita.

MPlanchard
fonte
se queremos pesquisar com vários IDs de objetos, exatamente como implementamos a condição WHERE IN no mysql.
Pratswinz 13/01
Isto dá-me um erro: TypeError: filtro deve ser uma instância de dict, bson.son.SON, ou outro tipo que herda de collections.Mapping
David Okwii
1
@DavidOkwii - este exemplo é para o MongoShell. Parece que você está fugindo de Python, caso em que você iria querer fazer algo como:db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
MPlanchard
Isso está errado, o uso dessa abordagem em um db.test.findOneAndDelete(ObjectId('57eujhs76e7hs877e868'))comando excluirá um documento, mesmo que o ObjectId não corresponda ao ID especificado. Você precisa especificar com precisão assimdb.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
Danny Sofftie 30/06
1
Esta questão era sobre find(), não sobre findOneAndDelete().
MPLanchard
18

Você esqueceu de inserir aspas duplas. A consulta exata é

db.theColl.find( { "_id": ObjectId("4ecbe7f9e8c1c9092c000027") } )
Mohamed Abdullah J
fonte
"O problema era que eu não estava colocando aspas em torno da minha identificação." -
7/12/2011
@jcollum Como atualização, a consulta que você coloca agora seria válida sem as aspas em torno de _id.
AnimalTesting
4

Se você estiver trabalhando no shell mongo, consulte: Resposta de Tyler Brock

Eu escrevi a resposta se você estiver usando mongodb usando node.js

Você não precisa converter o ID em um ObjectId. Apenas use :

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

esse método de coleção converterá automaticamente o ID em ObjectId.

Por outro lado :

db.collection.findOne({"_id":'4ecbe7f9e8c1c9092c000027'})não funciona como esperado. Você converteu manualmente o ID em ObjectId.

Isso pode ser feito assim:

let id = '58c85d1b7932a14c7a0a320d';

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

db.collection.findOne({"_id":o_id});
saurabh gupta
fonte
findById deve ser uma função / método do mongoose - onde ele converte internamente a string em ObjectId, a menos que você use o mongoose, esse código não ajuda você, seja um nó ou outro .. !!
whoami
1
yes..i esqueci de mencionar que mangusto é necessária ..... obrigado pela correção
Gupta saurabh
3

Acabei de ter esse problema e estava fazendo exatamente o que foi documentado e ainda não estava funcionando.

Veja sua mensagem de erro e verifique se você não possui nenhum caractere especial copiado. Eu estava recebendo o erro

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

Quando cheguei ao personagem 43, era apenas o início do meu ID do objeto, após as aspas abertas, exatamente como o colei. Coloquei o cursor lá e pressionei backspace. Nada parecia acontecer quando deveria ter removido a cotação aberta. Apertei backspace novamente e ele removeu a cotação aberta, depois coloquei a cotação novamente e executei a consulta e funcionou, apesar de parecer exatamente o mesmo.

Eu estava desenvolvendo o WebMatrix e copiei o ID do objeto do console. Sempre que você copiar do console no WebMatrix, é provável que você escolha alguns caracteres invisíveis que causarão erros.

Patrick Graham
fonte
3

Depois de abrir a CLI do mongo, conectada e autorizada no banco de dados correto.

O exemplo a seguir mostra como localizar o documento com o _id = 568c28fffc4be30d44d0398e de uma coleção chamada "produtos":

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

Nas funções do MongoDB Stitch, isso pode ser feito usando o BSON como abaixo:

Use o ObjectIdauxiliar no pacote do utilitário BSON para esse fim, como no exemplo a seguir:

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

Acho melhor você escrever algo assim:

db.getCollection('Blog').find({"_id":ObjectId("58f6724e97990e9de4f17c23")})
mina_anwer
fonte
Você pode explicar um pouco como esse código responde à pergunta?
214176 6
-1

Para usar o método Objectid, você não precisa importá-lo. Já está no objeto mongodb.

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

Miguel Peguero
fonte
1
Não:TypeError: db.ObjectId is not a function
jorisw
É sóObjectId("SOMETHING")
Ben Sinclair
-1

Se você estiver usando o Node.js:

Nesse req.user está o 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
fonte
-5

Simplesmente faça:

db.getCollection('test').find('4ecbe7f9e8c1c9092c000027');
Shalabh Raizada
fonte
Isso não funciona para mim a partir da Mongo Shellversão 3.2.7.
Amio.io
1
Isso corresponderá apenas a um _id que é uma string; se for um ObjectId verdadeiro, você precisará pesquisar usando a sintaxe do ObjectId.
precisa saber é o seguinte