MongoDB - 获取集合中每组具有max属性的文档

时间:2014-09-17 14:09:40

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

我的数据如下:

session, age, firstName, lastName
1, 28, John, Doe
1, 21, Donna, Keren
2, 32, Jenna, Haze
2, 52, Tommy, Lee
..
..

我希望获得每个会话中最大(按年龄)的所有行。所以对于上面的输入,我的输出看起来像:

sessionid, age, firstName, lastName
1, 28, John, Doe
2, 52, Tommy, Lee

因为John在session = 1组中的年龄最大,而Tommy在session = 2组中的年龄最大。

我需要将结果导出到文件(csv),它可能包含大量记录。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:13)

MongoDB聚合提供$max运算符,但在您的情况下,您需要"整个"记录原样。因此,适当的做法是$sort,然后在$first语句中使用$group运算符:

db.collection.aggregate([
    { "$sort": { "session": 1, "age": -1 } },
    { "$group": {
        "_id": "$session",
        "age": { "$first": "$age" },
        "firstName": { "$first" "$firstName" },
        "lastName": { "$first": "$lastName" }
    }}
])

所以"排序"获得正确的订单,并且"分组"选择"分组"中的第一个匹配项。这些字段存在的关键字。

这里大多数$first因为$sort按相反的顺序完成。您也可以按升序使用$last

答案 1 :(得分:-4)

您可以尝试以下使用max属性的聚合查询:http://docs.mongodb.org/manual/reference/operator/aggregation/max/

db.collection.aggregate([
   $group: {
       "_id": "$session",           
       "age": { $max: "$age" }
     },
   { $out : "max_age" }
])

结果应输出到新集合max_age,然后您可以将其转储到csv中。

注意:它只会提供会话和最大年龄,并且不会返回其他字段。