使用不同的字段和1个选择查询返回MongoDB中的整个文档

时间:2017-05-23 21:33:58

标签: node.js mongodb mongodb-query aggregation-framework

我在编写一个返回整个文档但仍有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
}

非常感谢任何帮助!

1 个答案:

答案 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字段将包含最新的文档。