我是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,所以我认为我无法访问更高版本中提供的聚合功能。如果这是普遍的共识,愿意升级。
非常感谢提前!
答案 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
}
如果无法升级,我建议以编程方式进行升级。