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

orc*_*man 4 mongoose mongodb node.js mongodb-query aggregation-framework

我的数据如下:

session, age, firstName, lastName
1, 28, John, Doe
1, 21, Donna, Keren
2, 32, Jenna, Haze
2, 52, Tommy, Lee
..
..
Run Code Online (Sandbox Code Playgroud)

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

sessionid, age, firstName, lastName
1, 28, John, Doe
2, 52, Tommy, Lee
Run Code Online (Sandbox Code Playgroud)

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

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

我怎样才能做到这一点?

Nei*_*unn 14

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" }
    }}
])
Run Code Online (Sandbox Code Playgroud)

因此,"排序"使订单正确,"分组"选择"分组"键中存在这些字段的第一个匹配.

$first这里主要是因为它$sort是以相反的顺序完成的.您也可以$last按升序使用.


Lal*_*wal -6

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

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

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

注意:它只会给出会话和最大年龄,不会返回其他字段。

  • @orcaman 甚至无法远程完成您所要求的工作。`$max` 从单个字段传播单个项目。您要求返回一整“行”数据。这不是你的答案,如果你接受不能回答你问题的东西,就会对未来的人造成重大伤害。 (6认同)
  • @NeilLunn 我不明白你想说什么,但我希望你已经阅读了我答案中的注释。 (2认同)