Mongodb聚合:选择字段中具有最高值的每种类型的记录

时间:2017-10-24 18:34:59

标签: mongodb

使用Mongodb Aggregation管道(我仍在发现),如何选择字段中具有最高值的每种类型的记录。

结果应包括匹配行的所有字段(变量而非预定义)。

示例数据:

[
    {_id:1, "type":"a", "price":1, ...},
    {_id:2, "type":"a", "price":2, ...},
    {_id:3, "type":"b", "price":3, ...},
    {_id:4, "type":"b", "price":4, ...},
]

预期结果:

[
    {_id:2, "type":"a", "price":2, ...},
    {_id:4, "type":"b", "price":4, ...},
]

我想过

  1. 使用$sort然后使用$limit 1.但是如何将限制应用于每种类型而不是整个集合?
  2. 使用$match某种"其中max"条件是否存在?
  3. $group$max$first一起使用,但不包括所有字段
  4. 如何订购或嵌套操作以实现所需的结果?

1 个答案:

答案 0 :(得分:2)

尝试以下查询:

db.yourDb.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $sort: {
                "price": -1
            }
        },

        // Stage 2
        {
            $group: {
                "_id": "$type",
                "document": { "$first": "$$ROOT" }
            }
        },

        // Stage 3
        {
            $replaceRoot: {
                "newRoot": "$document"
            }
        },

    ]

);

它应该返回以下结果:

{ 
    "_id" : NumberInt(2), 
    "type" : "a", 
    "price" : NumberInt(2)
}
{ 
    "_id" : NumberInt(4), 
    "type" : "b", 
    "price" : NumberInt(4)
}