如何在mongo控制台中按其ObjectId搜索对象?


265

我已经找到了针对C#和Perl的问题,但没有在本机界面中找到。我认为这可以工作:

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

该查询未返回任何结果。我通过db.theColl.find()抓取一个ObjectId 找到了4ecbe7f9e8c1c9092c000027 。该集合中有数千个对象。

我已经阅读了在mongodb.org网站上可以找到的所有页面,但没有找到。这是一件奇怪的事吗?对我来说似乎很正常。

Answers:


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

难怪:当我搜索“找到对象ID”该页面没上来:mongodb.org/...
jcollum

1
是的,您可能不小心键入了“ use dbname”并切换了数据库。我假设您没有使用复制或分片,这显然会为为什么它不显示而产生其他可能性。
泰勒·布洛克

1
问题是我没有在_id周围加上引号。
jcollum

9
哇,我不知道这在MongoDB中有什么特别之处,以为我的问题在其他地方,浪费了一些时间,但是找到它只是需要附加的规则。对于那些需要使用express和node的人来说,他们需要需要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})

编辑:更正为新的ObjectId(id),而不是新的ObjectID(id)


5
import { ObjectId } from "mongodb";适用于更高级的JS。
NetOperator Wibby

84

甚至更容易,尤其是在制表符完成时:

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

编辑:也可与findOne用于更漂亮输出的命令一起使用。


如果我们想使用多个对象ID进行搜索,就像我们在mysql中实现WHERE IN条件的方式一样。
Pratswinz

这给我一个错误:TypeError:筛选器必须是dict,bson.son.SON或从collections
David Okwii,2013年

1
@DavidOkwii-此示例适用于MongoShell。看起来您是从Python运行的,在这种情况下,您需要执行以下操作:db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
MPlanchard

这是错误的,db.test.findOneAndDelete(ObjectId('57eujhs76e7hs877e868'))即使ObjectId与指定的ID不匹配,在命令中使用这种方法也会删除文档。您需要精确地指定db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
Danny Sofftie

1
这个问题是关于find()而不是关于findOneAndDelete()
MPlanchard '18年

18

您错过了插入双引号的操作。确切查询为

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

“问题是我没有在_id周围加上引号。” -2011年12月7日,请参阅第一个答案的评论
jcollum

@jcollum作为更新,您现在输入的查询将在不带_id的引号的情况下有效。
AnimalTesting '16

4

如果您正在使用mongo shell,请参考:Tyler Brock的回答

如果您使用node.js使用mongodb,我就写了答案

您无需将ID转换为ObjectId。只需使用:

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

此收集方法将自动将id转换为ObjectId。

另一方面 :

db.collection.findOne({"_id":'4ecbe7f9e8c1c9092c000027'})不能按预期工作。您已将ID手动转换为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个字符时,它只是对象ID的开头,恰好是粘贴在开放引号之后的位置。我将光标放在此处,并按了退格键,应该删除开放引号时似乎没有任何反应。我再次按退格键,它删除了打开的引号,然后我将引号放回去并执行了查询,尽管看起来完全一样,但它仍然有效。

我正在WebMatrix中进行开发,并从控制台复制了对象ID。每当您从WebMatrix中的控制台复制时,都有可能拾取一些会导致错误的不可见字符。


3

打开mongo CLI后,将在正确的数据库上进行连接和授权。

以下示例显示如何从名为“产品”的集合中查找具有_id = 568c28fffc4be30d44d0398e 的文档

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

2

在MongoDB Stitch函数中,可以使用BSON如下所示:

ObjectId为此,请使用BSON实用工具包中的帮助程序,如以下示例所示:

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


-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
jorisw

只是ObjectId("SOMETHING")
Ben Sinclair,

-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 Shell3.2.7版本开始,这对我不起作用。
Amio.io

1
那只会匹配一个字符串的_id;如果它是真正的ObjectId,则需要使用ObjectId语法进行搜索。
文斯·鲍德伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.