我在编写一个返回整个文档但仍有1个不同字段的查询时遇到问题。 我已经试图搞乱聚合但无济于事。谷歌搜索后我已经找到了这个文件:
How to efficiently perform "distinct" with multiple keys?
它描述了我需要的大部分解决方案,但我也需要在另一个字段上进行过滤。
这是我现在用来查询TempCollection中文档的排序列表的函数。
function getLatestUserData(UserID, callback) {
console.log("in func " + UserID);
Temp.find({ UId: UserID }).sort({ "created_at" : -1 }).exec( function (err, data) {
console.log(data + " " + err);
callback(data);
});
};
但是,我无法弄清楚如何同时对所有内容进行过滤,排序和区分。
这是尝试使用Aggregates,然而,阅读文章已有一段时间了,我只是无法找出我需要的语法:
function getLatestUserData(UserID, callback) {
Temp.aggregate([
{"$group": { "_id": { value: "$value", SerialNumber: "$SerialNumber" } }},
{$filter : {input: "$UId", as: "UId", cond: {$U: [ "$UId", UserID ]} }}
]).exec( function (err, data) {
callback(data);
});
};
以下是TempCollection的一部分:
/* 1 */
{
"updatedAt" : ISODate("2017-05-23T13:01:45.000Z"),
"created_at" : ISODate("2017-05-23T13:01:45.000Z"),
"UId" : "590b10221da091b2618a4913",
"value" : 36,
"SerialNumber" : "TEST2",
"_id" : ObjectId("592432b9372464833d038b80"),
"__v" : 0
}
/* 2 */
{
"updatedAt" : ISODate("2017-05-23T14:23:39.000Z"),
"created_at" : ISODate("2017-05-23T14:23:39.000Z"),
"UId" : "58f8954c3602b80552b6f1fb",
"value" : 39,
"SerialNumber" : "IIOJOIMJ",
"_id" : ObjectId("592445eb372464833d038bf4"),
"__v" : 0
}
非常感谢任何帮助!
答案 0 :(得分:1)
您需要在$match
而非UID
上添加$filter
(仅用于数组字段)
)然后使用$sort
上的des created_at
和不同键上的$group
,同时在$$ROOT
累加运算符内使用$first
变量来选择最新的整个文档。
像
这样的东西 Temp.aggregate([
{"$match":{ "UId": UserID }},
{"$sort":{ "created_at" : -1 }},
{"$group": { "_id": { value: "$value", SerialNumber: "$SerialNumber" }, "data":{"$first":"$$ROOT"}}}
])
data
字段将包含最新的文档。