2013-12-17 90 views
0

我正在使用范围查询处理分页功能。我使用这个测试查询在蒙戈外壳:如何在不使用mongo shell的情况下查询ObjectId

> var params = {$query: {_id: {$lt: ObjectId("52b06166eff887999c6efbd9")}}, $orderby: {_id: -1}, $maxScan: 3} 
> params 
{ 
    "$query" : { 
    "_id" : { 
     "$lt" : ObjectId("52b06166eff887999c6efbd9") 
    } 
    }, 
    "$orderby" : { 
    "_id" : -1 
    }, 
    "$maxScan" : 3 
} 
> db.events.find(params) 

我希望能够通过序列化params对象到Web服务(如URL查询字符串)。但是,ObjectId类仅在shell中可用。有没有办法指定ObjectId作为不在shell中的查询的一部分?我已经试过以下为$lt值没有成功:

'ObjectId("52b06166eff887999c6efbd9")' 
'new ObjectId("52b06166eff887999c6efbd9")' 
{"$oid" : "52b06166eff887999c6efbd9"} 

回答

1

一般来说,这种抽象是无论你使用MongoDB的驱动程序处理。如果您使用的是实际的驱动程序,你可以做查询上_id不使用ObjectId()

猫鼬/ Node.js的例子:

People.find({ _id : "Valid ObjectID String" }, function(e, person) { 
    console.log(e, person); 
}); 

如果你仍然需要ObjectId帮手,通常你能够引用它在任何你需要的本地驱动程序。

+0

感谢您的澄清。虽然我也在下面提到,我在客户端JavaScript中这样做,所以我不确定是否有适用的驱动程序... – ytran

+0

@ytran在这种情况下,这一切都归结为请求如何碰到'mongo'外壳。从它的声音中,你可能正在做的是写一个文件并将其管入“mongo”外壳。如果是这样的话,你可以解析_id字段并用ObjectId('+ string +')替换_id字符串' –

+0

@ytran然而,你应该小心,这很容易让MongoDB实例失效。例如,这个查询可以传递到你的webhook中:'{“$ where”:“while(1 = 1){};” }' –

1

在最后一个例子中,你正在做的是将你的objectId作为一个字符串(前两个例子)或作为字典的第三个例子。所以肯定它不起作用。

您只能传递一个字符串'52b06166eff887999c6efbd9'作为参数,然后当您收到它时,您可以在服务器上构建正常的ObjectId。例如在PHP中,您可以通过以下方式构建它:new MongoId('your string');

+0

感谢您的反馈。不幸的是,在这种情况下,我正在使用现有的Web服务,所以没有服务器端的说法。 – ytran

相关问题