返回MongoDB中ID周围的文档范围



我有一个文档的ID,需要返回文档以及之前的10个文档和之后的10个文件。总共21个文档。

我没有任何键的起始值或结束值。仅限任一方向的极限。

最好的方法?提前谢谢。

您知道ObjectID包含时间戳吗?因此,它们总是代表自然插入顺序。因此,如果你在已知文档_id之前或之后寻找文档,你可以这样做:

我们的文件:

{ "_id" : ObjectId("5307f2d80f936e03d1a1d1c8"), "a" : 1 }
{ "_id" : ObjectId("5307f2db0f936e03d1a1d1c9"), "b" : 1 }
{ "_id" : ObjectId("5307f2de0f936e03d1a1d1ca"), "c" : 1 }
{ "_id" : ObjectId("5307f2e20f936e03d1a1d1cb"), "d" : 1 }
{ "_id" : ObjectId("5307f2e50f936e03d1a1d1cc"), "e" : 1 }
{ "_id" : ObjectId("5307f2e90f936e03d1a1d1cd"), "f" : 1 }
{ "_id" : ObjectId("5307f2ec0f936e03d1a1d1ce"), "g" : 1 }
{ "_id" : ObjectId("5307f2ee0f936e03d1a1d1cf"), "h" : 1 }
{ "_id" : ObjectId("5307f2f10f936e03d1a1d1d0"), "i" : 1 }
{ "_id" : ObjectId("5307f2f50f936e03d1a1d1d1"), "j" : 1 }
{ "_id" : ObjectId("5307f3020f936e03d1a1d1d2"), "j" : 1 }

所以我们知道"f"的_id,得到它和接下来的2个文档:

> db.items.find({ _id: {$gte: ObjectId("5307f2e90f936e03d1a1d1cd") } }).limit(3)
{ "_id" : ObjectId("5307f2e90f936e03d1a1d1cd"), "f" : 1 }
{ "_id" : ObjectId("5307f2ec0f936e03d1a1d1ce"), "g" : 1 }
{ "_id" : ObjectId("5307f2ee0f936e03d1a1d1cf"), "h" : 1 }

反过来做同样的事情:

> db.items.find({ _id: {$lte: ObjectId("5307f2e90f936e03d1a1d1cd") } })
.sort({ _id: -1 }).limit(3)
{ "_id" : ObjectId("5307f2e90f936e03d1a1d1cd"), "f" : 1 }
{ "_id" : ObjectId("5307f2e50f936e03d1a1d1cc"), "e" : 1 }
{ "_id" : ObjectId("5307f2e20f936e03d1a1d1cb"), "d" : 1 }

这是一种比扫描集合更好的方法。

Neil的回答很好地回答了上述问题(假设您使用的是自动生成的ObjectId),但请记住,给定文档前后的10个文档的概念有一些微妙之处。

这里记录了ObjectId的完整格式。请注意,它由以下字段组成:

  • 时间戳到1秒分辨率
  • 机器标识符
  • 进程id
  • 计数器

通常,如果您不指定自己的_id,它们将由客户端机器上的驱动程序自动生成。因此,只要ObjectId是在客户端单机上的单个进程上生成的,它们的顺序确实反映了它们的生成顺序,在典型的应用程序中,这也将是插入顺序(但不一定是)。但是,如果您有多个进程或多个客户端计算机,则这些多个源在给定秒内生成的对象的ObjectId的顺序与插入顺序之间存在不可预测的关系。

最新更新