MongoDB:如何按字段分组并获得最新结果?

时间:2014-11-11 18:10:49

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

我在MongoDB集合中有以下数据

[
  {name: "weight", value: 95,  date: "2014-11-07"},
  {name: "hips",   value: 105, date: "2014-02-06"},
  {name: "weight", value: 89,  date: "2014-05-12"}
]

我正在尝试获取以下数据:

每个名称,其中包含最近的日期

[
  {_id: "weight", value: 95,  date: "2014-11-07"},
  {_id: "hips",   value: 105, date: "2014-02-06"}
]

我已经研究了聚合:

group: {
  _id: "$name",
  date: { $max: "$date" }
}

但我没有得到我想要的结果。我需要找到的

[
  {_id: "weight", date: "2014-11-07"},
  {_id: "hips",   date: "2014-02-06"}
]

如何让mongo返回此聚合中的值?或聚合错误的方法?

1 个答案:

答案 0 :(得分:2)

您的“约会”值并不能真正帮助您。你应该使用BSON date而不是你现在拥有的“字符串”。至少你串起一个“词汇”,所以他们会正确排序。

但原则基本相同。您需要aggregation framework才能获得结果。此处的主要操作是$sort到日期,并使用$first grouping operator$group管道阶段:

Model.aggregate(
    [
        // Sort on the date per grouping key
        { "$sort": { "name": 1, "date": 1 } },

        // Then group
        { "$group": {
            "_id": "$name",
            "value": { "$first": "$value" },
            "date": { "$first": "$date" }
        }}
    ],
    function(err,results) {
        // do something with results
    }
) 

$max运算符仅适用于奇异值。对于“整行”或其他相关值,您需要“排序”并使用$first$last之类的运算符。