我需要在插入数据库的最后一个数据序列中首次出现。如果可以在一个查询中完成它将会很棒。
我们说我有这样的数据:
{_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不是函数
所以我当时不知道......是否有可能这样做?
答案 0 :(得分:1)
我认为您没有将函数作为ForEach的参数传递:
db.getCollection(...).aggregate(...).ForEach(function(myDoc) {
print( myDoc.ts );
});
然后关于聚合,我不确定这是否可行。由于文档在某种程度上与虚拟序列相关联。我会这样做: