MongoDB - 密钥上的计数和分组

时间:2014-03-02 14:29:20

标签: mongodb count group-by

我是MongoDb的新手,我正试图了解分组/计数功能。我想检索每个曲目ID的投票列表,按照他们的投票排序。你能帮助我理解这个吗?

列表架构:

{
    "title" : "Bit of everything",
    "tracks" : [ 
        ObjectId("5310af6518668c271d52aa8d"), 
        ObjectId("53122ffdc974dd3c48c4b74e"), 
        ObjectId("53123045c974dd3c48c4b74f"), 
        ObjectId("5312309cc974dd3c48c4b750")
    ],
    "votes" : [ 
        {
            "track_id" : "5310af6518668c271d52aa8d",
            "user_id" : "5312551c92d49d6119481c88"
        }, 
        {
            "track_id" : "53122ffdc974dd3c48c4b74e",
            "user_id" : "5310f488000e4aa02abcec8e"
        }, 
        {
            "track_id" : "53123045c974dd3c48c4b74f",
            "user_id" : "5312551c92d49d6119481c88"
        }
    ]
}

我希望生成以下结果(理想情况是按投票数排序,理想情况下还包括投票数组中没有条目的投票,使用曲目作为参考。):

[
 {
   track_id: 5310af6518668c271d52aa8d,
   track_votes: 1
 },
 {
   track_id: 5312309cc974dd3c48c4b750,
   track_votes: 0
 }
 ...
]

在MySQL中,我会执行以下

SELECT COUNT(*) AS track_votes, track_id FROM list_votes GROUP BY track_id ORDER BY track_votes DESC

我一直在研究各种聚合/缩减功能的文档,但我似乎无法为我的特定情况做任何工作。

任何人都可以帮我开始这个查询吗?一旦我知道这些结构如何,我就可以将这些知识应用到其他地方了!

我在Ubuntu 12上使用mongodb版本2.0.4,所以我认为我无法访问更高版本中提供的聚合功能。如果这是普遍的共识,愿意升级。

非常感谢提前!

1 个答案:

答案 0 :(得分:1)

我建议您将MongoDB版本升级到2.2并使用Aggregation Framework,如下所示:

db.collection.aggregate(
   { $unwind:"$votes"},
   { $group : { _id : "$votes.track_id", number : { $sum : 1 } } }
)

MongoDB 2.2引入了一个新的聚合框架,以数据处理流水线的概念为蓝本。文档进入多阶段管道,将文档转换为聚合结果。

输出将如下所示:

{
    "result":[
        {
            "_id" : "5310af6518668c271d52aa8d", <- ObjectId
            "number" : 2
        },
        ...

    ],
    "ok" : 1
}

如果无法升级,我建议以编程方式进行升级。