以自然顺序从MongoDB上限集合中检索一系列项目

时间:2013-05-01 22:45:06

标签: mongodb

当_id字段或多或少随机时,有没有办法检索上限集合中的一系列项目?

假设我们创建了一个简单的上限集合,如:

> db.createCollection("capped_test", {capped: true, size: 1048576})
{ "ok" : 1 }
> db.capped_test.insert({_id: 512, v: "test"})
> db.capped_test.insert({_id: 111, v: "test"})
> db.capped_test.insert({_id: 316, v: "test"})
> db.capped_test.insert({_id: 983, v: "test"})
> db.capped_test.insert({_id: 326, v: "test"})

我要做的是从_id:111到_id:983以自然顺序检索文档。如果我尝试这样的话:

> db.capped_test.find({_id: {$gte: 111, $lte: 983}}).sort({$natural: 1})

我得到了所有的文件,(因为所有的ID都在这个范围内,这是有意义的)

{ "_id" : 512, "v" : "test" }
{ "_id" : 111, "v" : "test" }
{ "_id" : 316, "v" : "test" }
{ "_id" : 983, "v" : "test" }
{ "_id" : 326, "v" : "test" }

我正在寻找的是一个可以产生的查询:

{ "_id" : 111, "v" : "test" }
{ "_id" : 316, "v" : "test" }
{ "_id" : 983, "v" : "test" }

这可能吗?

我的实际用例涉及许多客户写入单个上限集合。周期性,我想启动一个map reduce工作,计算自上次map reduce工作运行以来添加的数据的一些聚合。因此,我可以作为db.collection.mapReduce()选项传递的查询对象将非常有用。

修改

为了澄清,使用ObjectID时似乎存在同样的问题,并且您有多个客户端写入同一个集合。鉴于ObjectID由ObjectId("ttttttttmmmmmmppppcccccc")组成,其中t是时间戳,m是机器ID,p是进程ID,c是计数器,我们可以模拟在同一时间戳内插入文档的多个客户端:

> db.createCollection("capped_test", {capped: true, size: 1048576})
{ "ok" : 1 }
>
> // Client with machine id 1 writes
> db.capped_test.insert({_id: ObjectId("000000010000010000000000"), v: "test"})
> db.capped_test.insert({_id: ObjectId("000000010000010000000001"), v: "test"})
> db.capped_test.insert({_id: ObjectId("000000010000010000000002"), v: "test"})
>
> // Client with machine id 2 writes
> db.capped_test.insert({_id: ObjectId("000000010000020000000000"), v: "test"})
> db.capped_test.insert({_id: ObjectId("000000010000020000000001"), v: "test"})
>
> // Client with mahcine id 1 writes again
> db.capped_test.insert({_id: ObjectId("000000010000010000000003"), v: "test"})
> db.capped_test.insert({_id: ObjectId("000000010000010000000004"), v: "test"})

查询第二个和第二个到最后一个文档之间的所有文档:

> db.capped_test.find({_id: {$gte: ObjectId("000000010000010000000001"), $lte: ObjectId("000000010000010000000003")}}).sort({$natural: 1})
{ "_id" : ObjectId("000000010000010000000001"), "v" : "test" }
{ "_id" : ObjectId("000000010000010000000002"), "v" : "test" }
{ "_id" : ObjectId("000000010000010000000003"), "v" : "test" }

当期望的结果是:

{ "_id" : ObjectId("000000010000010000000001"), "v" : "test" }
{ "_id" : ObjectId("000000010000010000000002"), "v" : "test" }
{ "_id" : ObjectId("000000010000020000000000"), "v" : "test" }
{ "_id" : ObjectId("000000010000020000000001"), "v" : "test" }
{ "_id" : ObjectId("000000010000010000000003"), "v" : "test" }

0 个答案:

没有答案