在数据的最后一个序列中获得第一个匹配项
问题描述:
我需要在插入到数据库的最后一个数据序列中获得第一个匹配项。如果可以在一个查询中完成,那将会很棒。在数据的最后一个序列中获得第一个匹配项
比方说,我有数据是这样的:
{_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
所以我不知道,然后...是它甚至有可能做到这一点?
答
我想你没有通过一个功能的foreach参数:
db.getCollection(...).aggregate(...).ForEach(function(myDoc) {
print(myDoc.ts);
});
然后与聚合,我不知道这是可能的。由于该文件通过虚拟序列有点链接。我会这样做:
- 创建一个游标与按日期和ID排序的查询。
- 用foreach迭代它(这将通过20个 文档序列提取数据,你不会全收结束了在内存中(无论是在客户端或DB))
- 有几个if语句支票如果序列是真/假并打印最后一个假序列的第一次出现。