Mongodb 查询:每个项目按日期的最新记录
Mongodb Query: Latest record by date for each item
一个集合中有六个设备,每个设备都有很多记录,有些有新日期的记录,有些有周 or/and 个月的记录。我需要查询每个设备的 returns 最新记录。在 .aggregate() 的情况下,我需要完整的 "data" 归档。
这是示例 json。
{
"date_time" : some-date
"device_id" : 27,
"gateway_id" : 1,
"data": [{"r" : 203,"v" : 3642},{"r" : 221,"v" : 3666}]
}
{
"date_time" : some-date
"device_id" : 28,
"gateway_id" : 1,
"data": [{"r" : 203,"v" : 3002},{"r" : 221,"v" : 3006}]
}
{
"date_time" : some-date
"device_id" : 29,
"gateway_id" : 1,
"data": [{"r" : 203,"v" : 3002}, {"r" : 221,"v" : 3006}]
}
我尝试了很多查询但没有成功。
请注意以下不适用于这种情况。
db.col.find({"device_id": {"$in": devices}, "date_time": { "$gte": last_date}}) .sort({$natural: -1})
db.col.find({"device_id": {"$in": devices}, "date_time": { "$gte": last_date}}) .sort({$natural: -1}).limit(1)
db.col.find({"device_id": {"$in": devices}}) .sort({"date_time": -1}).limit(1)
db.col.find({"device_id": {"$in": devices}}) .sort({"_id": -1}).limit(1)
我正在寻找仅提供集合中每个设备的最新记录的查询。请注意,在 .aggregate() 的情况下,我需要完整的 "data" 归档。
尝试使用以下代码段
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 将在每行中最新。
输出是-
{
"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
}
谢谢
使用 findOne 而不是 find Query
db.collection.findOne({})
一个集合中有六个设备,每个设备都有很多记录,有些有新日期的记录,有些有周 or/and 个月的记录。我需要查询每个设备的 returns 最新记录。在 .aggregate() 的情况下,我需要完整的 "data" 归档。
这是示例 json。
{
"date_time" : some-date
"device_id" : 27,
"gateway_id" : 1,
"data": [{"r" : 203,"v" : 3642},{"r" : 221,"v" : 3666}]
}
{
"date_time" : some-date
"device_id" : 28,
"gateway_id" : 1,
"data": [{"r" : 203,"v" : 3002},{"r" : 221,"v" : 3006}]
}
{
"date_time" : some-date
"device_id" : 29,
"gateway_id" : 1,
"data": [{"r" : 203,"v" : 3002}, {"r" : 221,"v" : 3006}]
}
我尝试了很多查询但没有成功。
请注意以下不适用于这种情况。
db.col.find({"device_id": {"$in": devices}, "date_time": { "$gte": last_date}}) .sort({$natural: -1})
db.col.find({"device_id": {"$in": devices}, "date_time": { "$gte": last_date}}) .sort({$natural: -1}).limit(1)
db.col.find({"device_id": {"$in": devices}}) .sort({"date_time": -1}).limit(1)
db.col.find({"device_id": {"$in": devices}}) .sort({"_id": -1}).limit(1)
我正在寻找仅提供集合中每个设备的最新记录的查询。请注意,在 .aggregate() 的情况下,我需要完整的 "data" 归档。
尝试使用以下代码段
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 将在每行中最新。
输出是-
{
"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
}
谢谢
使用 findOne 而不是 find Query db.collection.findOne({})