Jak szukać obiektu według jego ObjectId w konsoli mangowej?

265

Znalazłem odpowiedź na to pytanie dla C # i Perla, ale nie w natywnym interfejsie. Myślałem, że to zadziała:

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

Zapytanie nie zwróciło wyników. Znalazłem 4ecbe7f9e8c1c9092c000027, wykonując db.theColl.find()i chwytając ObjectId. W tej kolekcji znajduje się kilka tysięcy obiektów.

Przeczytałem wszystkie strony, które mogłem znaleźć na stronie internetowej mongodb.org i nie znalazłem. Czy to tylko dziwna rzecz? Wydaje mi się to całkiem normalne.

jcollum
źródło

Odpowiedzi:

416

Nic dziwnego, ludzie robią to cały czas. Upewnij się, że nazwa kolekcji jest poprawna (wielkość liter ma znaczenie) i że ObjectId jest dokładny.

Dokumentacja jest tutaj

> 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
źródło
1
Dziwne, zrestartowałem konsolę i nagle zadziałało. Czy jest jakiś sposób, aby zmienić „zakres” lub coś w wierszu poleceń i naprawdę tego nie wiedzieć?
jcollum
Nic dziwnego: kiedy szukam „find ObjectID”, ta strona się nie pojawiła: mongodb.org/…
jcollum
1
Tak, mogłeś przypadkowo wpisać „use dbname” i przełączyć bazy danych. Zakładam, że nie używasz replikacji ani dzielenia na fragmenty, co oczywiście stworzyłoby inne możliwości, dlaczego się nie pojawił.
Tyler Brock
1
Problem polegał na tym, że nie umieszczałem cudzysłowów wokół mojego _id.
jcollum,
9
Wow, nie miałem pojęcia, że ​​to coś wyjątkowego w MongoDB, zmarnowałem trochę czasu myśląc, że mój problem jest gdzie indziej, ale znalezienie go wymagało tylko dodatkowych zasad. dla tego, co jest warte, ludzie używający express i node będą musieli wymagać ObjectId exp ... var ObjectId = wymagają ('mongodb'). ObjectID;
Chris Hawkes,
87

Jeśli używasz 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})

Edycja: poprawiono do nowego ObjectId (id), a nie nowego ObjectID (id)

Mustafa Deniz
źródło
5
import { ObjectId } from "mongodb";pracuje dla bardziej wymagającego JS.
NetOperator Wibby
84

Jeszcze łatwiejsze, zwłaszcza przy uzupełnianiu tabulatorów:

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

Edycja: działa również z findOnepoleceniem ładniejszego wyjścia.

MPlanchard
źródło
jeśli chcemy wyszukiwać z wieloma obiektowymi identyfikatorami, podobnie jak w przypadku, gdy implementujemy warunek WHERE IN w mysql.
Pratswinz
Daje mi to błąd: TypeError: filter musi być instancją dict, bson.son.SON lub innego typu, który dziedziczy z kolekcji.
Mapowanie
1
@DavidOkwii - ten przykład dotyczy MongoShell. Wygląda na to, że korzystasz z Pythona, w którym to przypadku chcesz zrobić coś takiego:db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
MPlanchard
To źle, użycie tego podejścia w db.test.findOneAndDelete(ObjectId('57eujhs76e7hs877e868'))poleceniu spowoduje usunięcie dokumentu, nawet jeśli identyfikator obiektu nie jest zgodny z określonym identyfikatorem. Musisz dokładnie to określićdb.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
Danny Sofftie
1
To pytanie dotyczyło find(), a nie dotyczyło findOneAndDelete().
MPlanchard
18

Nie udało Ci się wstawić podwójnych cudzysłowów. Dokładne zapytanie to

db.theColl.find( { "_id": ObjectId("4ecbe7f9e8c1c9092c000027") } )
Mohamed Abdullah J.
źródło
„Problem polegał na tym, że nie umieszczałem cudzysłowów wokół mojego _id”. - 7 grudnia 2011 r., Zobacz komentarze do pierwszej odpowiedzi
jcollum,
@jcollum Jako aktualizacja, wprowadzone teraz zapytanie byłoby poprawne bez cudzysłowów wokół _id.
AnimalTesting
4

Jeśli pracujesz nad powłoką mongo, zapoznaj się z tym: Odpowiedź Tylera Brocka

Napisałem odpowiedź, jeśli używasz mongodb za pomocą node.js

Nie musisz konwertować identyfikatora na ObjectId. Po prostu użyj :

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

ta metoda kolekcji automatycznie konwertuje identyfikator na ObjectId.

Z drugiej strony :

db.collection.findOne({"_id":'4ecbe7f9e8c1c9092c000027'})nie działa zgodnie z oczekiwaniami. Ręcznie przekonwertowałeś identyfikator na ObjectId.

Można to zrobić w następujący sposób:

let id = '58c85d1b7932a14c7a0a320d';

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

db.collection.findOne({"_id":o_id});
saurabh gupta
źródło
findById powinien być funkcją / metodą z mangusty - tam, gdzie wewnętrznie konwertuje ciąg znaków na ObjectId, chyba że użyjesz mangusty, ten kod nie pomoże ci, czy to węzeł czy inny .. !!
whoami,
1
tak .. zapomniałem wspomnieć, że mangusta jest wymagana ..... dziękuję za korektę
saurabh gupta
3

Właśnie miałem ten problem i działałem dokładnie tak, jak zostało to udokumentowane i nadal nie działało.

Spójrz na swój komunikat o błędzie i upewnij się, że nie masz żadnych skopiowanych znaków specjalnych. Wystąpił błąd

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

Kiedy podszedłem do postaci 43, był to dopiero początek mojego identyfikatora obiektu, po otwartych cudzysłowach, dokładnie tak, jak wkleiłem go. Umieściłem tam kursor i nacisnąłem backspace, nic się nie wydarzyło, gdy powinno było usunąć otwarty cytat. Znów nacisnąłem backspace i usunąłem otwartą wycenę, a następnie ponownie wstawiłem wycenę i wykonałem zapytanie i zadziałało, mimo że wyglądało dokładnie tak samo.

Robiłem programowanie w WebMatrix i skopiowałem identyfikator obiektu z konsoli. Ilekroć kopiujesz z konsoli w WebMatrix, prawdopodobnie wychwytujesz niewidoczne znaki, które będą powodować błędy.

Patrick Graham
źródło
3

Po otwarciu mongo CLI, podłączony i autoryzowany w odpowiedniej bazie danych.

Poniższy przykład pokazuje, jak znaleźć dokument z identyfikatorem _id = 568c28fffc4be30d44d0398e z kolekcji o nazwie „produkty”:

db.products.find({"_id": ObjectId("568c28fffc4be30d44d0398e")})
Oliver Wolf
źródło
2

W funkcjach ściegu MongoDB można to zrobić za pomocą BSON, jak poniżej:

Skorzystaj z ObjectIdpomocnika w pakiecie narzędziowym BSON w tym celu, jak w poniższym przykładzie:

var id = "5bb9e9f84186b222c8901149";  
BSON.ObjectId(id);
kushal.8
źródło
1

Myślę, że lepiej napisz coś takiego:

db.getCollection('Blog').find({"_id":ObjectId("58f6724e97990e9de4f17c23")})
mina_anwer
źródło
Czy możesz wyjaśnić trochę, w jaki sposób ten kod odpowiada na pytanie?
Ḟḹáḿíṅḡ Ⱬỏḿƀíé
-1

Aby użyć metody Objectid, nie musisz jej importować. Jest już na obiekcie mongodb.

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

Miguel Peguero
źródło
1
Nie:TypeError: db.ObjectId is not a function
jutro
Po prostuObjectId("SOMETHING")
Ben Sinclair
-1

Jeśli używasz Node.js:

W tym wymaganym trybie jest obiekt 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
źródło
-5

Po prostu wykonaj:

db.getCollection('test').find('4ecbe7f9e8c1c9092c000027');
Shalabh Raizada
źródło
To nie działa dla mnie od Mongo Shellwersji 3.2.7.
Amio.io,
1
To będzie pasować tylko do _id, który jest łańcuchem; jeśli jest to prawdziwy ObjectId, musisz szukać używając składni ObjectId.
Vince Bowdren,