Как мне найти объект по его ObjectId в консоли Монго?

265

Я нашел ответ на этот вопрос для C # и Perl, но не в родном интерфейсе. Я думал, что это будет работать:

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

Запрос не дал результатов. Я нашел 4ecbe7f9e8c1c9092c000027, выполнив db.theColl.find()и взяв ObjectId. В этой коллекции несколько тысяч предметов.

Я прочитал все страницы, которые мог найти на сайте mongodb.org, и не нашел его. Это просто странная вещь? Мне кажется, это нормально.

jcollum
источник

Ответы:

417

Как ни странно, люди делают это постоянно. Убедитесь, что имя коллекции является правильным (регистр имеет значение) и что 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
Неудивительно: когда я ищу 'find ObjectID', эта страница не появляется: mongodb.org/…
jcollum
1
Да, возможно, вы случайно набрали «use dbname» и переключили базы данных. Я предполагаю, что вы не используете репликацию или сегментирование, что, очевидно, создаст другие возможности для того, почему он не будет отображаться.
Тайлер Брок
1
Проблема заключалась в том, что я не помещал цитаты вокруг своего _id.
Jcollum
9
Ух ты, я понятия не имел, что это было нечто особенное в MongoDB, потраченное впустую немного времени, думая, что моя проблема была в другом месте, но обнаружение этого просто требовало дополнительных правил. для чего стоит людям, использующим экспресс и узел, потребуется ObjectId exp ... var ObjectId = require ('mongodb'). ObjectID;
Крис Хокс
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})

Изменить: исправлено новый идентификатор объекта (идентификатор), а не новый идентификатор объекта (идентификатор)

Мустафа Дениз
источник
5
import { ObjectId } from "mongodb";работает для любителя JS.
NetOperator Wibby
84

Еще проще, особенно с завершением табуляции:

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

Редактировать: также работает с findOneкомандой для более красивого вывода.

MPlanchard
источник
если мы хотим искать с несколькими объектными идентификаторами так же, как мы реализуем условие WHERE IN в mysql.
Pratswinz
Это дает мне ошибку: TypeError: фильтр должен быть экземпляром 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')})
Дэнни Соффти
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 должен быть функцией / методом из mongoose - где он внутренне преобразует строку в ObjectId, если только вы не используете mongoose, этот код не поможет вам, является ли он узлом или другим ... !!
whoami
1
да .. я забыл упомянуть, что мангуст необходим ..... спасибо за исправление
Саурабх Гупта
3

У меня просто была эта проблема, и я делал то, что было задокументировано, но она все еще не работала.

Посмотрите на ваше сообщение об ошибке и убедитесь, что у вас нет скопированных специальных символов. Я получаю сообщение об ошибке

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

Когда я перешел к символу 43, это был только начало моего идентификатора объекта, после открытых кавычек, именно так, как я его вставил. Я поместил свой курсор туда и нажал клавишу Backspace, но ничего не произошло, когда он должен был удалить открытую кавычку. Я снова нажал клавишу Backspace, и она удалила открытую кавычку, затем я вернула кавычку обратно и выполнила запрос, и он работал, несмотря на то, что выглядел точно так же.

Я занимался разработкой в ​​WebMatrix и скопировал идентификатор объекта из консоли. Всякий раз, когда вы копируете с консоли в WebMatrix, вы, вероятно, обнаружите некоторые невидимые символы, которые приведут к ошибкам.

Патрик Грэм
источник
3

После того, как вы открыли Mongo CLI, подключились и авторизовались на нужной базе данных.

В следующем примере показано, как найти документ с _id = 568c28fffc4be30d44d0398e из коллекции под названием «products»:

db.products.find({"_id": ObjectId("568c28fffc4be30d44d0398e")})
Оливер Вольф
источник
2

В функциях MongoDB Stitch это можно сделать с помощью BSON, как показано ниже:

Для этого используйте ObjectIdпомощник в пакете утилит BSON, как в следующем примере:

var id = "5bb9e9f84186b222c8901149";  
BSON.ObjectId(id);
kushal.8
источник
1

Я думаю, вам лучше написать что-то вроде этого:

db.getCollection('Blog').find({"_id":ObjectId("58f6724e97990e9de4f17c23")})
mina_anwer
источник
Можете ли вы объяснить, как этот код отвечает на вопрос?
Apráḿíṅḡ Ⱬỏḿƀíé
-1

Чтобы использовать метод Objectid, вам не нужно его импортировать. Это уже на объекте mongodb.

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

Мигель Пегеро
источник
1
Нет:TypeError: db.ObjectId is not a function
Джорисв
Это просто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.
Винс Боудрен