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语句检查序列是否为真/假,并打印最后一个假序列的第一个匹配项