2011-11-22 100 views
149

我发现这个问题的答案是C#和Perl,但不是在本机界面。我认为这会工作:如何在控制台中通过其ObjectId搜索对象?

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

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

我读过了我在mongodb.org网站上找到的所有网页,但没有找到它。这只是一个奇怪的事情吗?对我来说这似乎很正常。

回答

235

一点都不奇怪,人们总是这样做。确保集合名称正确(大小写很重要)并且ObjectId是确切的。

文档是here

> 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

+0

难怪:当我寻找页面没有出现的'find ObjectID'时:http://www.mongodb.org/dosearchsite.action?queryString=find+ObjectId&where=DOCS – jcollum

+0

是的,你可能会意外地键入“使用dbname“和切换数据库。我假设你没有使用复制或分片,这显然会产生其他可能性,为什么它没有出现。 –

56

更容易,尤其是片完成:

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

编辑:也可与用于漂亮输出findOne命令。

+0

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

+0

这给我一个错误:TypeError:过滤器必须是dict,bson.son.SON或其他继承自collections的类型的实例。映射 –

+1

@DavidOkwii - 此示例用于MongoShell。它看起来像你从Python运行,在这种情况下,你会想做一些事情:'db.test.find({'_ id':ObjectId('4ecc05e55dd98a436ddcc47c')})' – MPlanchard

10

您错过了插入双引号。 准确的查询是

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

“问题是,我wasn不要在我的_id上加引号。“ - 2011年12月7日,请参阅第一个回答的评论 – jcollum

+0

@jcollum作为更新,您现在放置的查询将在_id附近没有引号的情况下有效。 – AnimalTesting

43

如果您使用的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),而不是新的对象ID(ID)

+1

一直在受这一个! tx –

-3

根本就:

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

这不适用于'Mongo Shell' 3.2.7版本。 – zatziky

+0

这只会匹配一个字符串_id,如果它是一个真正的ObjectId,则需要使用ObjectId语法进行搜索。 –

2

我刚刚遇到了这个问题,并且完全按照记录,它仍然无法正常工作。

看看你的错误信息,并确保你没有在复制的任何特殊字符。我得到的错误

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

当我去者角色43这是我的对象ID的仅仅是开始,在公开引号之后,就像我粘贴的那样。我将光标放在那里,并且在回退时,如果它应该删除公开引用,则什么都不会发生。我再次打退格,它删除了公开报价,然后我把报价放回去并执行了查询,尽管看起来完全一样,它仍然有效。

我在WebMatrix中进行开发,并从控制台复制对象ID。无论何时从WebMatrix中的控制台复制,您都可能会拾取一些会导致错误的隐形字符。

3

一旦你打开了mongo CLI,连接并授权了正确的数据库。

The following example shows how to find the document with the _id=568c28fffc4be30d44d0398e from a collection called “products”:

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

我想你最好写的是这样的:

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

你能解释一下这个代码如何回答这个问题吗? –

0

要使用的ObjectId方法,你不必将其导入。它已经在mongodb对象上。

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

+1

Nope:'TypeError:db.ObjectId不是函数' – jorisw

+0

它只是'ObjectId(“SOMETHING”)' – Andy