MongoDB选择distinct和sort

时间:2016-02-25 15:33:34

标签: mongodb

考虑我有这样的数据:

| id   | property | score | remark        |
-------------------------------------------
| aaaa | alpha    | 1     | alpha lowest  |
| bbbb | beta     | 2     | beta highest  |
| cccc | alpha    | 2     | alpha highest |

根据上述数据,我想按字段property选择不同,并按score最高值对其进行排序,因此预期结果将为

| id   | property | score | remark        |
-------------------------------------------
| bbbb | beta     | 2     | beta highest  |
| cccc | alpha    | 2     | alpha highest |

如何使用mongodb执行此操作?

2 个答案:

答案 0 :(得分:2)

您可以通过运行以下聚合管道操作轻松完成此操作:

db.collection.aggregate([
    { "$sort": { "score": -1 } },
    { 
        "$group": { 
            "_id": "$property", 
            "id": { "$first": "$_id" },
            "score": { "$first": "$score" },
            "remark": { "$first": "$remark" }
        }
    }, 
    { 
        "$project": { 
            "_id": 0,
            "property": "$_id",
            "score": 1,
            "remark": 1, 
            "id": 1
        } 
    }
])

示例输出

{ "id" : "bbbb", "score" : 2, "remark" : "beta highest ", "property" : "beta" }
{ "id" : "cccc", "score" : 2, "remark" : "alpha highest ", "property" : "alpha" }

答案 1 :(得分:0)

MongoDB has a distinct operator。但是,它只返回一个“列”。您需要进行多个查询。 最好的选择是使用MongoDB Aggregation Framework。它使用pipeline of operations。 我不知道数据,但可能有点像:

db.collection.aggregate([
   { '$group' : { _id : '$property' , score: { '$max': '$score' } } }
])

您可以使用Robomongo client来试验此方法。