Wie suche ich nach einem Objekt anhand seiner ObjectId in der Mongo-Konsole?

265

Ich habe diese Frage für C # und Perl beantwortet gefunden, aber nicht in der nativen Oberfläche. Ich dachte das würde funktionieren:

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

Die Abfrage ergab keine Ergebnisse. Ich habe die 4ecbe7f9e8c1c9092c000027 gefunden, indem ich db.theColl.find()eine ObjectId ausgeführt und abgerufen habe. Diese Sammlung enthält mehrere tausend Objekte.

Ich habe alle Seiten gelesen, die ich auf der Website mongodb.org finden konnte, und habe sie nicht gefunden. Ist das nur eine seltsame Sache? Es scheint mir ziemlich normal zu sein.

jcollum
quelle

Antworten:

416

Überhaupt nicht seltsam, die Leute machen das die ganze Zeit. Stellen Sie sicher, dass der Name der Sammlung korrekt ist (Groß- und Kleinschreibung) und dass die ObjectId genau ist.

Die Dokumentation ist hier

> 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
quelle
1
Seltsamerweise habe ich meine Konsole neu gestartet und es hat plötzlich funktioniert. Gibt es eine Möglichkeit, Ihren "Bereich" oder etwas in der Befehlszeile zu ändern und es nicht wirklich zu wissen?
JCollum
Kein Wunder: Als ich nach 'find ObjectID' suchte, wurde diese Seite nicht angezeigt
jcollum
1
Ja, Sie haben möglicherweise versehentlich "use dbname" eingegeben und die Datenbank gewechselt. Ich gehe davon aus, dass Sie keine Replikation oder kein Sharding verwenden, was offensichtlich andere Möglichkeiten schaffen würde, warum es nicht angezeigt wurde.
Tyler Brock
1
Das Problem war, dass ich meine _id nicht in Anführungszeichen setzte.
JCollum
9
Wow, ich hatte keine Ahnung, dass dies etwas Besonderes in MongoDB ist. Ich habe ein bisschen Zeit damit verschwendet, zu glauben, mein Problem sei anderswo, aber es zu finden, erforderte nur zusätzliche Regeln. Für das, was es wert ist, müssen Benutzer, die Express und Node verwenden, ObjectId exp ... var ObjectId = require ('mongodb'). ObjectID;
Chris Hawkes
87

Wenn Sie Node.js verwenden:

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

Bearbeiten: Korrigiert auf neue ObjectId (ID), nicht auf neue ObjectID (ID)

Mustafa Deniz
quelle
5
import { ObjectId } from "mongodb";arbeitet für den schickeren JS.
NetOperator Wibby
84

Noch einfacher, insbesondere bei Tab-Vervollständigung:

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

Bearbeiten: Funktioniert auch mit dem findOneBefehl für eine schönere Ausgabe.

MPlanchard
quelle
Wenn wir mit mehreren Objekt-IDs suchen möchten, genau wie wir die WHERE IN-Bedingung in MySQL implementieren.
Pratswinz
Dies gibt mir einen Fehler: TypeError: Filter muss eine Instanz von dict, bson.son.SON oder einem anderen Typ sein, der von Sammlungen erbt.
Mapping
1
@DavidOkwii - Dieses Beispiel ist für die MongoShell. Es sieht so aus, als würden Sie von Python aus laufen. In diesem Fall möchten Sie db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
Folgendes
Dies ist falsch. db.test.findOneAndDelete(ObjectId('57eujhs76e7hs877e868'))Wenn Sie diesen Ansatz in einem Befehl verwenden, wird ein Dokument gelöscht, auch wenn die ObjectId nicht mit der angegebenen ID übereinstimmt. Sie müssen genau so spezifizierendb.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
Danny Sofftie
1
Bei dieser Frage ging es um find(), nicht um findOneAndDelete().
MPlanchard
18

Sie haben es versäumt, doppelte Anführungszeichen einzufügen. Die genaue Abfrage lautet

db.theColl.find( { "_id": ObjectId("4ecbe7f9e8c1c9092c000027") } )
Mohamed Abdullah J.
quelle
"Das Problem war, dass ich meine _id nicht in Anführungszeichen gesetzt habe." - 7. Dezember 2011, siehe die Kommentare zur ersten Antwort
jcollum
@jcollum Als Update wäre die Abfrage, die Sie jetzt stellen, ohne die Anführungszeichen um _id gültig.
AnimalTesting
4

Wenn Sie an der Mongo-Muschel arbeiten, lesen Sie bitte Folgendes: Antwort von Tyler Brock

Ich habe die Antwort geschrieben, wenn Sie mongodb mit node.js verwenden

Sie müssen die ID nicht in eine konvertieren ObjectId. Benutz einfach :

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

Diese Erfassungsmethode konvertiert die ID automatisch in ObjectId.

Andererseits :

db.collection.findOne({"_id":'4ecbe7f9e8c1c9092c000027'})funktioniert nicht wie erwartet. Sie haben die ID manuell in konvertiert ObjectId.

Das kann so gemacht werden:

let id = '58c85d1b7932a14c7a0a320d';

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

db.collection.findOne({"_id":o_id});
Saurabh Gupta
quelle
findById sollte eine Funktion / Methode von mongoose sein - bei der ein String intern in ObjectId konvertiert wird, es sei denn, Sie verwenden mongoose. Dieser Code hilft Ihnen nicht, ob es sich um einen Knoten oder einen anderen handelt. !!
whoami
1
Ja ... ich habe vergessen zu erwähnen, dass Mungo erforderlich ist ... Danke für die Korrektur
Saurabh Gupta
3

Ich hatte gerade dieses Problem und tat genau das, was dokumentiert war und es funktionierte immer noch nicht.

Sehen Sie sich Ihre Fehlermeldung an und stellen Sie sicher, dass keine Sonderzeichen kopiert wurden. Ich habe den Fehler erhalten

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

Als ich zu Zeichen 43 ging, war es nur der Anfang meiner Objekt-ID nach den offenen Anführungszeichen, genau so, wie ich sie eingefügt habe. Ich setzte meinen Cursor dort und drückte die Rücktaste. Es schien nichts zu passieren, wenn es das offene Anführungszeichen hätte entfernen sollen. Ich drückte erneut auf die Rücktaste und entfernte das offene Anführungszeichen. Dann setzte ich das Anführungszeichen wieder ein und führte die Abfrage aus. Es funktionierte, obwohl es genau gleich aussah.

Ich habe in WebMatrix entwickelt und die Objekt-ID von der Konsole kopiert. Wenn Sie in WebMatrix von der Konsole kopieren, werden Sie wahrscheinlich einige unsichtbare Zeichen erkennen, die Fehler verursachen.

Patrick Graham
quelle
3

Sobald Sie die Mongo-CLI geöffnet haben, sind Sie mit der richtigen Datenbank verbunden und autorisiert.

Das folgende Beispiel zeigt, wie Sie das Dokument mit der _id = 568c28fffc4be30d44d0398e aus einer Sammlung mit dem Namen "products" finden:

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

In MongoDB Stitch-Funktionen kann dies mit BSON wie folgt durchgeführt werden:

Verwenden Sie dazu den ObjectIdHelfer im BSON-Dienstprogrammpaket wie im folgenden Beispiel:

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

Ich denke, du schreibst besser so etwas:

db.getCollection('Blog').find({"_id":ObjectId("58f6724e97990e9de4f17c23")})
mina_anwer
quelle
Können Sie ein wenig erklären, wie dieser Code die Frage beantwortet?
20áḿíṅḡ Ⱬỏḿƀíé
-1

Um die Objectid-Methode zu verwenden, müssen Sie sie nicht importieren. Es befindet sich bereits auf dem Mongodb-Objekt.

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

Miguel Peguero
quelle
1
Nein:TypeError: db.ObjectId is not a function
Jorisw
Es ist nurObjectId("SOMETHING")
Ben Sinclair
-1

Wenn Sie Node.js verwenden:

In diesem req.user ist ObjectId-Format.

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
quelle
-5

Einfach machen:

db.getCollection('test').find('4ecbe7f9e8c1c9092c000027');
Shalabh Raizada
quelle
Dies funktioniert bei mir ab Mongo ShellVersion 3.2.7 nicht mehr.
Amio.io
1
Das stimmt nur mit einer _id überein, die eine Zeichenfolge ist. Wenn es sich um eine echte ObjectId handelt, müssen Sie mit der ObjectId-Syntax suchen.
Vince Bowdren