Mongodb 使用数据获取最后一个序列中的第一个匹配项

Mongodb 使用数据获取最后一个序列中的第一个匹配项,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我需要获取插入数据库的最后一个数据序列中的第一个匹配项。如果可以在一个查询中完成,那就太好了 假设我有这样的数据: {_id:......,ts:Date("2017-10-24T00:00:00.000Z"), id: 1, ok: false} {_id:......,ts:Date("2017-10-23T00:00:00.000Z"), id: 1, ok: false} {_id:......,ts:Date("2017-10-22T00:00:00.000Z"), id: 1, ok

我需要获取插入数据库的最后一个数据序列中的第一个匹配项。如果可以在一个查询中完成,那就太好了

假设我有这样的数据:

{_id:......,ts:Date("2017-10-24T00:00:00.000Z"), id: 1, ok: false}
{_id:......,ts:Date("2017-10-23T00:00:00.000Z"), id: 1, ok: false}
{_id:......,ts:Date("2017-10-22T00:00:00.000Z"), id: 1, ok: true}
{_id:......,ts:Date("2017-10-21T00:00:00.000Z"), id: 1, ok: true}
{_id:......,ts:Date("2017-10-20T00:00:00.000Z"), id: 1, ok: false}
{_id:......,ts:Date("2017-10-21T00:00:00.000Z"), id: 2, ok: false}
{_id:......,ts:Date("2017-10-20T00:00:00.000Z"), id: 2, ok: true}
我需要得到每个ID的第一个匹配项,当字段ok为false时,在最后一个序列中,当ok为false时

{_id:......,ts:Date("2017-10-23T00:00:00.000Z"), id: 1, ok: false}
但是每个id都需要它。我似乎不可能做到这一点,所以我不需要对数据库进行上千次查询。我知道如何对一个ID进行查询,但是如果我需要对每个ID发送查询,那么数据库将被淹没

这是我当前的查询:

{
    $sort : {ts : -1}
},
{
    $match : {"ok" : true }
},
{
    $group : {
        _id : {id : "$id"},
        last : {$last : "$$CURRENT"}
    }
}
这将为每个id提供最后一个ok true数据

但我需要后面的数据。有没有简单的可伸缩的方法来实现ok false

我试图在聚合上使用foreach函数,但如果我这样做,就会出现错误

TypeError:db.getCollection(…).aggregate(…).foreach不是函数


所以我不知道。。。甚至有可能做到这一点吗

我认为您没有将函数作为ForEach的参数传递:

db.getCollection(...).aggregate(...).ForEach(function(myDoc) { 
                        print( myDoc.ts ); 
                        });
那么关于聚合,我不确定这是否可行。由于文档在某种程度上由虚拟序列链接。我会这样做:

  • 使用按日期和id排序的查询创建游标
  • 使用ForEach对其进行迭代(这将按20的顺序提取数据) 文档,您不会在内存中保存整个集合(在客户端或数据库上))
  • 使用一些if语句检查序列是否为真/假,并打印最后一个假序列的第一个匹配项