【问题标题】:MongoDB max values query and _idMongoDB 最大值查询和 _id
【发布时间】:2015-07-24 11:49:52
【问题描述】:

db.collections.find()

    { "_id" : ObjectId("55b0c2a0339bf8d00ab0bade"), "score" : 46, "playerid" : "45"}
    { "_id" : ObjectId("55b0c2de339bf8d00ab0badf"), "score" : 88, "playerid" : "45"}
    { "_id" : ObjectId("55b0cbca17f398f4281ab931"), "score" : 46, "playerid" : "99"}
    { "_id" : ObjectId("55b15ababe2df0f430d1cb93"), "score" : 89, "playerid" : "45"}

我想要做的是检索所有得分最高的文档。如果同一玩家出现不止一次,那么我们将获得该特定玩家得分最高的文档。

结果如下所示:

    { "_id" : "55b0cbca17f398f4281ab931", "score" : 46 }
    { "_id" : "55b15ababe2df0f430d1cb93", "score" : 89 }

这是我卡住的地方:

db.players.aggregate([

{ "$group": { 
    "_id": "$playerid",
    score: { $max: "$score" }
} }
])

返回:

    { "_id" : "99", "score" : "46" }
    { "_id" : "45", "score" : "89" }

现在,这是正确的。但我只需要 ObjectID。

【问题讨论】:

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


    【解决方案1】:

    如果其他属性对您很重要,请使用 $sort 和 $first,而不是 $max:

    db.players.aggregate([
       { "$sort": { "score": -1 } },
       { "$group": { 
           "_id": "$playerid",
           "docId": { "$first": "$_id" },
           "score": { "$first": "$score" }
       }}
    ])
    

    $max 运算符当然只适用于您指定的“一个”字段。为了从集合文档中获取详细信息,您需要 $sort 并获取分组边界上的 $first 出现。

    当然$first 是相对于$sort 的“降序”顺序,否则使用$last 升序,作为排序键的“最大值”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多