当 _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" }