通过一个字段与另一个字段的不同来排序重复条目

时间:2013-12-01 23:26:07

标签: django mongodb mongoengine

我环顾四周,找不到一个好的答案,而且我对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做这个,所以如果有人知道如何做到这一点很酷,但如果不是我只会做一个原始查询,所以任何帮助都是好的。 非常感谢!

1 个答案:

答案 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