mongodb - Mongo聚合框架无法按两个字段排序?

标签 mongodb sorting pymongo aggregation-framework

我正在对 mongo 2.4.9 集合进行一些聚合,但无法按两个字段对结果进行排序。这是我使用 PyMongo 进行的查询:

result = mongo_coll.aggregate([{"$match": {"_cls": "class1"},
                               {"$group": {"_id": {"currency": "$total.currency",
                                                   "v_id": "$v_id"},
                                           "total": {"$sum": "$total.amount"},
                                           "count": {"$sum": 1}}},
                               {"$sort": {"_id.currency": 1, "total": -1}}])

我的结果按“总计”排序:-1

如果我将最后一行替换为以下内容:

                               {"$sort": {"total": -1, "_id.currency": 1}}])

仍然按“total”排序:-1

如果我将其替换为以下内容:

                               {"$sort": {"_id.currency": 1}}])

它按货币排序。

但我无法按照我想要的方式对其进行排序,这意味着首先按货币排序,然后按总数排序...(其他结果看起来不错,正如预期的那样)。有人有线索吗?

最好提前致谢!

更新:这是一个示例文档:

{
  "_id": { "$oid" : "533d0a3b830f783478a75aa1" },
  "_cls": "class1",
  "v_id": 6813,
  "total": {
    "amount": 680,
    "currency": "EUR",
    "exp": -2
  }
}

最佳答案

感谢 MongoDB 用户 Google 群组中 Bernie 的回答,我实际上可以找到 Python 发生这种情况的原因:

Python dict 是无序的,这对于排序来说非常明智:-p

这就是为什么参数可以作为 BSON.SON dict 或作为 OrderedDict 给出,以使其更加Pythonic!

这是我使用的解决方案:

    from collections import OrderedDict
    sort_dict = OrderedDict()
    sort_dict['_id.currency'] = 1
    sort_dict['total'] = -1

然后

{"$sort": sort_dict}

编辑 链接来自 response在 Google 用户组中...

关于mongodb - Mongo聚合框架无法按两个字段排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22817921/

相关文章:

javascript - 在 jQuery 中对相同类型的多个元素进行排序

python - MongoDB 需要安装才能与 pymongo 一起使用吗?

javascript - 如何计算 ObjectId 数组中 ObjectId 的出现次数并将结果附加到要返回的每个文档?

mongodb - 在 MongoDb 中,如何获取嵌入数组中出现的单个匹配元素的 max\min\avg\count ?

java - 如何使数组处理更快?

node.js - 下划线分组按排序

django - 如何记录pymongo查询?

python - PyMongo Aggregation 从字符串创建管道

MongoDB Map/Reduce Array 聚合问题

Mongodb 没有启动