Come posso cercare un oggetto tramite il suo ObjectId nella console mongo?


265

Ho trovato la risposta a questa domanda per C # e Perl, ma non nell'interfaccia nativa. Ho pensato che avrebbe funzionato:

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

La query non ha restituito risultati. Ho trovato il 4ecbe7f9e8c1c9092c000027 facendo db.theColl.find()e afferrando un ObjectId. Ci sono diverse migliaia di oggetti in quella raccolta.

Ho letto tutte le pagine che ho trovato sul sito Web mongodb.org e non l'ho trovato. È solo una cosa strana da fare? Mi sembra abbastanza normale.

Risposte:


417

Non è affatto strano, la gente lo fa sempre. Assicurarsi che il nome della raccolta sia corretto (il caso è importante) e che l'ObjectId sia esatto.

La documentazione è qui

> 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
Strano, ho riavviato la mia console e all'improvviso ha funzionato. C'è un modo per cambiare il tuo "ambito" o qualcosa dalla riga di comando e non saperlo davvero?
jcollum,

Non c'è da stupirsi: quando cerco "trova ObjectID" quella pagina non viene visualizzata: mongodb.org/…
jcollum

1
Sì, potresti aver accidentalmente digitato "usa dbname" e cambiato database. Suppongo che tu non stia utilizzando la replica o lo sharding, il che ovviamente creerebbe altre possibilità per il motivo per cui non si è presentato.
Tyler Brock,

1
Il problema era che non stavo mettendo le virgolette attorno al mio _id.
jcollum,

9
Wow, non avevo idea che questo fosse qualcosa di speciale in MongoDB perso un po 'di tempo pensando che il mio problema fosse altrove, ma trovarlo richiedeva solo regole aggiuntive. per quello che vale la gente che usa express e node dovranno richiedere ObjectId exp ... var ObjectId = require ('mongodb'). ObjectID;
Chris Hawkes,

87

Se stai 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})

Modifica: corretto per il nuovo ObjectId (id), non per il nuovo ObjectID (id)


5
import { ObjectId } from "mongodb";lavora per il fancier JS.
NetOperator Wibby,

84

Ancora più semplice, soprattutto con il completamento con la scheda:

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

Modifica: funziona anche con il findOnecomando per un output più bello.


se vogliamo cercare con più ID oggetto proprio come il modo in cui implementiamo la condizione WHERE IN in mysql.
Pratswinz,

Questo mi dà un errore: TypeError: il filtro deve essere un'istanza di dict, bson.son.SON o un altro tipo che eredita dalle raccolte.Mapping
David Okwii,

1
@DavidOkwii: questo esempio è per MongoShell. Sembra che tu stia correndo da Python, nel qual caso vorresti fare qualcosa del tipo:db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
MPlanchard

Questo è sbagliato, l'utilizzo di questo approccio in un db.test.findOneAndDelete(ObjectId('57eujhs76e7hs877e868'))comando eliminerà un documento anche se l'ObjectId non corrisponde all'ID specificato. Devi specificare con precisione in questo mododb.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
Danny Sofftie,

1
Questa domanda riguardava find(), non circa findOneAndDelete().
MPlanchard,

18

Hai perso l'inserimento di virgolette doppie. La query esatta è

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

"Il problema era che non stavo mettendo le virgolette intorno al mio _id." - 7 dic 2011, vedi i commenti sulla prima risposta
jcollum,

@jcollum Come aggiornamento, la query che hai inserito ora sarebbe valida senza le virgolette intorno a _id.
AnimalTesting

4

Se stai lavorando sulla shell mongo, fai riferimento a questo: risposta di Tyler Brock

Ho scritto la risposta se stai usando mongodb usando node.js

Non è necessario convertire l'id in un ObjectId. Usa solo:

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

questo metodo di raccolta convertirà automaticamente l'id in ObjectId.

D'altro canto :

db.collection.findOne({"_id":'4ecbe7f9e8c1c9092c000027'})non funziona come previsto. Hai convertito manualmente l'id in ObjectId.

Questo può essere fatto in questo modo:

let id = '58c85d1b7932a14c7a0a320d';

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

db.collection.findOne({"_id":o_id});

findById dovrebbe essere una funzione / metodo di mongoose - dove converte internamente la stringa in ObjectId, a meno che tu non usi mongoose questo codice non ti aiuta se si tratta di nodo o altro .. !!
whoami,

1
si..ho dimenticato di dire che è richiesta la mangusta ..... grazie per la correzione
saurabh gupta

3

Ho appena avuto questo problema e stavo facendo esattamente come è stato documentato e ancora non funzionava.

Guarda il tuo messaggio di errore e assicurati di non aver copiato alcun carattere speciale. Stavo ottenendo l'errore

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

Quando sono andato al personaggio 43 era solo l'inizio del mio ID oggetto, dopo le virgolette aperte, esattamente come l'ho incollato. Ho messo il cursore lì e ho premuto backspace non sembrava accadere nulla quando avrebbe dovuto rimuovere la citazione aperta. Ho colpito di nuovo backspace e ho rimosso la citazione aperta, quindi ho rimesso la citazione ed eseguito la query e ha funzionato, nonostante fosse esattamente lo stesso.

Stavo facendo lo sviluppo in WebMatrix e ho copiato l'id oggetto dalla console. Ogni volta che copi dalla console in WebMatrix, è probabile che tu rilevi alcuni caratteri invisibili che causeranno errori.


3

Una volta aperta l'interfaccia della riga di comando di mongo, connessa e autorizzata nel database corretto.

L'esempio seguente mostra come trovare il documento con _id = 568c28fffc4be30d44d0398e da una raccolta chiamata "prodotti":

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

2

Nelle funzioni di MongoDB Stitch puoi farlo usando BSON come di seguito:

Utilizzare l' ObjectIdhelper nel pacchetto di utilità BSON per questo scopo, come nell'esempio seguente:

var id = "5bb9e9f84186b222c8901149";  
BSON.ObjectId(id);


-1

Per utilizzare il metodo Objectid non è necessario importarlo. È già sull'oggetto mongodb.

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


1
No:TypeError: db.ObjectId is not a function
jorisw,

È soloObjectId("SOMETHING")
Ben Sinclair, il

-1

Se stai usando Node.js:

In quel req.user è il 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;

-5

Fai semplicemente:

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

Questo non funziona per me dalla Mongo Shellversione 3.2.7.
Amio.io,

1
Che corrisponderà solo a un _id che è una stringa; se si tratta di un vero ObjectId, è necessario cercare utilizzando la sintassi ObjectId.
Vince Bowdren,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.