使用数据

时间:2017-10-20 11:37:57

标签: 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: 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}

当ok为false时,我需要在最后一个序列中ok字段为false时首次出现每个ID。

{_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错误做?

我尝试在聚合上使用foreach函数,但如果我这样做,我会收到错误

  

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

所以我当时不知道......是否有可能这样做?

1 个答案:

答案 0 :(得分:1)

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

db.getCollection(...).aggregate(...).ForEach(function(myDoc) { 
                        print( myDoc.ts ); 
                        });

然后关于聚合,我不确定这是否可行。由于文档在某种程度上与虚拟序列相关联。我会这样做:

  • 使用按日期和ID排序的查询创建游标。
  • 使用ForEach进行迭代(这将按20的序列提取数据 docs,你不会在内存中找到整个集合(在客户端或数据库上))
  • 有一些if语句检查序列是否为true / false并打印出最后一个错误序列的第一次出现。