Mongoose查询以检索具有相同属性的顺序文档

时间:2018-01-28 16:40:42

标签: mongodb mongoose

假设我在Mongo数据库中有许多JSON文档,就像这样(显然非常简单!;-)):

{ 'value': true }
{ 'value': false }
{ 'value': true }
{ 'value': true }
{ 'value': true }

我想构建一个查询,以检索value等于true的最新文档。 ('最近的文件'被理解为附在最后的文件。)

此处的结果应返回最后三个文档。

1 个答案:

答案 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之前的所有文档,以及那个文档,并且您将获得有效的结果,而无需运行其他查询。