我环顾四周,找不到一个好的答案,而且我对Mongo来说是全新的,所以如果有人可以提供帮助,这就是问题所在。 我在mongo中有一个集合,它以这种方式保存用户相关数据:
{user: 4, rate: 2, location: 1}
{user: 5, rate: 4, location: 1}
{user: 6, rate: 3, location: 1}
{user: 5, rate: 2, location: 1}
{user: 4, rate: 5, location: 1}
...
{user: x, rate: y, location: z}
现在我需要一个查询,它将返回特定位置的所有用户(此处为1但可以是任何内容)以及该用户的所有费率的最终总和,以及按相同费率总和排序的所有用户(希望这是有道理的)。所以像这样:
{4: 7, 5: 6, 6: 3} -> {user: sum(rate)} - ordered by sum(rate)
任何想法的家伙? 我将在mongoengine为Django做这个,所以如果有人知道如何做到这一点很酷,但如果不是我只会做一个原始查询,所以任何帮助都是好的。 非常感谢!
答案 0 :(得分:1)
您正在寻找的MongoDB功能是Aggregation Framework。
以下是mongo
shell中的示例查询:
db.collection.aggregate(
// Find matching documents (can take advantage of suitable index if present)
{ $match: {
location: 1
}},
// Add up rates by user
{ $group: {
_id: "$user",
rates: { $sum: "$rate" }
}},
// Order by total rates (ascending)
{ $sort: { rates: 1 }}
)
根据问题提供数据的示例结果:
[
{
"_id" : 6,
"rates" : 3
},
{
"_id" : 5,
"rates" : 6
},
{
"_id" : 4,
"rates" : 7
}
]
作为聚合中的可选步骤,您可能希望使用$project
将已分组的_id
字段重命名为user
。