我有一个集合,每2秒 for each uID(这是主键)存储一次数据.现在我想查询每个uID的最后30个文档,并根据它们的索引号将它们分组.在这种情况下如何处理?如果我应用$limit,那么所有UID只返回30个文档.
db.getCollection("devices").aggregate(
[
{
"$match" : {
"uID" : {
"$in" : [
"20200308",
"20200306",
"12345678"
]
}
}
}
],
{
"allowDiskUse" : false
}
);
上面的查询将返回所有文档,如何将查询限制 for each uID 30个文档?此外,如果查询成功,如何对不同文档的所有数组索引进行分组,以便得到一个字段的值之和,该字段包含30个分组在一起的文档.例子:
[
{
_id: 0, // index value of all array after grouping them.
sumOfValuesFoundInArrayIndex: 100,
},
{
_id: 1,
sumOfValuesFoundInArrayIndex: 600,
}
.
.
.
.
{
_id: 29,
sumOfValuesFoundInArrayIndex: 600,
}
]
JSON示例:
[
{
"timeStamp": 1644962269,
"uID": "20200308",
"capacityLeft": 500
},
{
"timeStamp": 1644962272,
"uID": "20200308",
"capacityLeft": 499
},
{
"timeStamp": 1644962275,
"uID": "20200306",
"capacityLeft": 300
},
{
"timeStamp": 1644962277,
"uID": "20200308",
"capacityLeft": 499
},
{
"timeStamp": 1644962277,
"uID": "20200306",
"capacityLeft": 300
},
{
"timeStamp": 1644962279,
"uID": "12345678",
"capacityLeft": 753
},
{
"timeStamp": 1644962281,
"uID": "12345678",
"capacityLeft": 752
},
{
"timeStamp": 1644962283,
"uID": "12345678",
"capacityLeft": 751
}
]
现在根据JSON,我需要 for each uID找到30个文档,并用时间戳对它们进行排序,这样当我查询我提到的所有设备时,我会得到提到的uID的最后30个文档,根据它们的数组索引对它们进行分组,然后将剩下的所有容量相加.