Як шукати об’єкт за його ObjectId в консолі mongo?


265

Я знайшов відповідь на це запитання для C # та Perl, але не у рідному інтерфейсі. Я думав, що це спрацює:

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

Запит не дав результатів. Я знайшов 4ecbe7f9e8c1c9092c000027, зробивши db.theColl.find()та захопивши ObjectId. У цій колекції є кілька тисяч предметів.

Я прочитав усі сторінки, які я міг знайти на веб-сайті mongodb.org, і не знайшов. Це просто дивна річ? Мені це здається досить нормальним.

Відповіді:


416

Зовсім не дивно, що люди так роблять постійно. Переконайтесь, що ім'я колекції правильне (справа має значення) та що ObjectId є точним.

Документація тут

> 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
Як не дивно, я перезапустив консоль, і вона раптом спрацювала. Чи є якийсь спосіб змінити "область" чи щось в командному рядку і насправді це не знати?
jcollum

Недарма: коли я шукав "знайти ObjectID", ця сторінка не з’явилася: mongodb.org/…
jcollum

1
Так, ви, можливо, випадково набрали "використовувати dbname" та переключили бази даних. Я припускаю, що ви не використовуєте реплікацію чи шардінг, що очевидно створило б інші можливості, чому вона не з’явилася.
Тайлер Брок

1
Проблема полягала в тому, що я не ставив цитати навколо свого _id.
jcollum

9
Нічого собі, я не мав уявлення, що це щось особливе в MongoDB витрачало трохи часу, думаючи, що моя проблема була в іншому місці, але пошук її просто вимагав додаткових правил. для чого варто людям, які використовують Express і node, потрібно вимагати ObjectId exp ... var ObjectId = requ ('mongodb').
Кріс Хоукс

87

Якщо ви використовуєте 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})

Редагувати: виправлено новий ObjectId (id), не новий ObjectID (id)


5
import { ObjectId } from "mongodb";працює для любителів JS.
NetOperator Wibby

84

Ще простіше, особливо із заповненням вкладок:

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

Правка: також працює з findOneкомандою для кращого виведення.


якщо ми хочемо шукати з декількома ідентифікаторами об'єктів так само, як ми реалізуємо умову WHERE IN в mysql.
Працвінз

Це дає мені помилку: TypeError: filter повинен бути екземпляром dict, bson.son.SON або іншого типу, який успадковується з колекцій.
Карта

1
@DavidOkwii - цей приклад для MongoShell. Схоже, ви біжите від Python, і в цьому випадку вам захочеться зробити щось на кшталт:db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
MPlanchard

Це неправильно, використовуючи такий підхід у db.test.findOneAndDelete(ObjectId('57eujhs76e7hs877e868'))команді, буде видалено документ, навіть якщо ObjectId не відповідає заданому ідентифікатору. Вам потрібно точно вказати такdb.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
Danny Sofftie

1
Це питання було про find(), а не про findOneAndDelete().
MPlanchard

18

Ви пропустили вставити подвійні котирування. Точний запит є

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

"Проблема полягала в тому, що я не ставив цитати навколо свого _id." - 7 грудня 2011, дивіться коментарі до першої відповіді
jcollum

@jcollum Як оновлення, запит, який ви поставите зараз, буде дійсним без лапок навколо _id.
AnimalTesting

4

Якщо ви працюєте над оболонкою монго, будь ласка, зверніться до цього: Відповідь від Тайлера Брока

Я написав відповідь, якщо ви використовуєте mongodb за допомогою node.js

Вам не потрібно конвертувати ідентифікатор у ObjectId. Просто використовуйте:

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

цей метод збирання автоматично перетворить id в ObjectId.

З іншої сторони :

db.collection.findOne({"_id":'4ecbe7f9e8c1c9092c000027'})не працює, як очікувалося. Ви вручну конвертуєте ідентифікатор у ObjectId.

Це можна зробити так:

let id = '58c85d1b7932a14c7a0a320d';

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

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

findById має бути функцією / методом від мангуста - де він внутрішньо перетворює рядок у ObjectId, якщо ви не використовуєте мангуст, цей код не допоможе вам, чи це вузол, чи інше .. !!
whoami

1
так .. я забув згадати, що мангуста потрібна ..... дякую за виправлення
saurabh gupta

3

Я просто мав це питання і робив саме так, як було задокументовано, і він все ще не працював.

Подивіться на повідомлення про помилку та переконайтеся, що у вас немає скопійованих спеціальних символів. Я отримував помилку

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

Коли я перейшов до символу 43, це був лише початок мого ідентифікатора об'єкта, після відкритих лапок, саме так, як я його вставив. Я поклав свій курсор туди і потрапив у зворотну простір, нічого не сталося, коли він мав би видалити відкриту цитату. Я знову натиснув "backspace", і він видалив відкриту цитату, потім я поставив цю цитату і виконав запит, і він спрацював, не дивлячись на те, що виглядає точно так само.

Я займався розробкою в WebMatrix і копіював ідентифікатор об'єкта з консолі. Кожного разу, коли ви копіюєте з консолі в WebMatrix, ви, швидше за все, підберете кілька невидимих ​​символів, які спричинить помилки.


3

Після відкриття CLI-mongo, підключений та авторизований у правій базі даних.

Наступний приклад показує, як знайти документ із _id = 568c28fffc4be30d44d0398e з колекції під назвою "products":

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

2

У функціях MongoDB Stitch це можна зробити за допомогою BSON, як показано нижче:

Використовуйте ObjectIdпомічник у пакеті утиліти BSON для цієї мети, як у наступному прикладі:

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

1

Я думаю, вам краще написати щось подібне:

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

Чи можете ви пояснити трохи, як цей код відповідає на питання?
Ḟḹáḿíṅḡ Ⱬỏḿƀíé

-1

Для використання методу Objectid вам не потрібно імпортувати його. Це вже на об’єкт mongodb.

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


1
Nope:TypeError: db.ObjectId is not a function
jorisw

Це простоObjectId("SOMETHING")
Бен Сінклер,

-1

Якщо ви використовуєте Node.js:

У цьому req.user є формат 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

Просто робіть:

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

Це не працює для мене з Mongo Shellверсії 3.2.7.
Amio.io

1
Це буде відповідати лише _id, який є рядком; якщо це справжній ObjectId, вам потрібно здійснити пошук за допомогою синтаксису ObjectId.
Вінс Боудрен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.