假设我在Mongo数据库中有许多JSON文档,就像这样(显然非常简单!;-)):
{ 'value': true }
{ 'value': false }
{ 'value': true }
{ 'value': true }
{ 'value': true }
我想构建一个查询,以检索value
等于true
的最新文档。 ('最近的文件'被理解为附在最后的文件。)
此处的结果应返回最后三个文档。
答案 0 :(得分:0)
如果您使用该集合中的默认ObjectID
,则可以使用它按插入顺序检索文档:
String[]
无论如何,请记住,如果在一秒钟内插入多个文档,订购可能不会100%准确:
db.collection.find({ value: true }).sort({ _id: -1 }).limit(3)
值的顺序与生成时间之间的关系在一秒钟内并不严格。如果单个系统上的多个系统或多个进程或线程在一秒钟内生成值;ObjectId
值不代表严格的广告订单。客户端之间的时钟偏差也会导致非严格的排序,即使是值,因为客户端驱动程序会生成ObjectId
值。
如果您真正想要的是获取ObjectId
所有文档,直到您点击value = true
的第一个文档,那么您需要多个查询:
value = false
请注意,根据第一个查询,您可能认为不需要在第二个查询中检查// Get the _id of the most recent document with value = false:
const fromId = db.collection
.find({ value: false })
.sort({ _id: -1 })
.limit(1)
.toArray()[0]._id;
// Get all the documents with _ids greater than fromId and value = true
db.collection.find({ value: true, _id: { $gte: fromId }});
,但由于这是两个独立的查询,因此可能插入了一些新文档他们之间。
或者,您可以选择不使用value = true
,以便检查第二个查询的结果是否包含value = true
作为完整性检查的任何文档。如果是这样,您只需要删除value = false
之前的所有文档,以及那个文档,并且您将获得有效的结果,而无需运行其他查询。