集合中有许多项目,每个项目都有很多记录,有些项目有新日期记录,有些项目有较长的周/月。我需要一个查询返回每个项目的最新记录。在.aggregate()的情况下,我需要完整的数据"提起。我希望使用mongodb $ group得到这个结果,每个设备的记录应该是最新的。
{
"result" : [
{
"_id" : 29,
"gateway_id" : 1,
"data" : [
{
"r" : 203,
"v" : 3002
},
{
"r" : 221,
"v" : 3006
}
],
"device_id" : 29,
"date_time" : "a"
},
{
"_id" : 28,
"gateway_id" : 1,
"data" : [
{
"r" : 203,
"v" : 3002
},
{
"r" : 221,
"v" : 3006
}
],
"device_id" : 28,
"date_time" : "b"
},
{
"_id" : 27,
"gateway_id" : 1,
"data" : [
{
"r" : 203,
"v" : 3642
},
{
"r" : 221,
"v" : 3666
}
],
"device_id" : 27,
"date_time" : "a"
}
],
"ok" : 1
}
我想使用mongodb $ group获得此结果,每个设备的记录应该是最新的。
答案 0 :(得分:2)
尝试使用以下代码段
db.collection.aggregate([
{$group: {
"_id": "$device_id",
"gateway_id": {"$last":"$gateway_id"},
"data": {"$last": '$data'},
"date": {"$last": '$date_time'},
}},
{$project: {
"device_id": "$_id",
"gateway_id": "$gateway_id",
"data": "$data",
"date_time": "$date"
}},
{$sort: {
'date': -1
}}
])
在上面的查询分组中,设备ID和日期,数据和gateway_id将在每一行中最新。
答案 1 :(得分:2)
我的回答是半相关的,但我正在添加到会议中,因为我在寻找这个时登陆了这里。我想对字段 email
上唯一的列表进行分组,并返回该组中找到的第一个文档,类似于 SQL 不同查询。
client
.collection('email_list')
.aggregate([
// group documents unique by "email" field, add a new prop "doc" with the full document of the first doc found in the DB
{ $group: { _id: '$email', doc: { $first: '$$ROOT' } } },
// replace the "root" document with the first document found in the DB
{ $replaceRoot: { newRoot: '$doc' } },
])
.toArray()