2017-10-20 142 views
2

我需要在插入到数据库的最后一个数据序列中获得第一个匹配项。如果可以在一个查询中完成,那将会很棒。在数据的最后一个序列中获得第一个匹配项

比方说,我有数据是这样的:

{_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第一次出现时,现场确定是假的最后一个序列中,当确定是假的。

{_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中的最后数据以确定真实。

但是我需要它后面的数据。有没有什么简单的可扩展的方式如何做好的错误?

我试图对总使用的foreach的功能,但如果我这样做,我得到错误

TypeError: db.getCollection(...).aggregate(...).foreach is not a function

所以我不知道,然后...是它甚至有可能做到这一点?

回答

1

我想你没有通过一个功能的foreach参数:

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

然后与聚合,我不知道这是可能的。由于该文件通过虚拟序列有点链接。我会这样做:

  • 创建一个游标与按日期和ID排序的查询。
  • 用foreach迭代它(这将通过20个 文档序列提取数据,你不会全收结束了在内存中(无论是在客户端或DB))
  • 有几个if语句支票如果序列是真/假并打印最后一个假序列的第一次出现。
相关问题