python - 按一个键的值排序mongodb

时间:2016-04-22 15:06:09

标签: python mongodb pymongo aggregation-framework mongoengine

我有一个包含以下数据结构的集合:

[{name: "123", category: "A"},
 {name: "456", category: "B"},
 {name: "789", category: "A"},
 {name: "101", category: "C"}]

我希望能够根据category的值对它们进行排序,方法是先指定哪一个。例如,按照B-> C-> A的顺序对查询进行排序,结果将产生:

[{name: "456", category: "B"},
 {name: "101", category: "C"},
 {name: "123", category: "A"},
 {name: "789", category: "A"}]

使用mongo查询API有什么好办法吗?我正在使用mongoengine

2 个答案:

答案 0 :(得分:2)

执行此操作的最佳方法是使用.aggregate()方法和$cond条件运算符将权重添加到$project阶段的文档中,然后使用$sort聚合运算符按 weight 对文档进行排序。

    framer.setSize(500,500);
    framer.setTitle("Problem 02");
    framer.setVisible(true);

使用PyMongo进行演示

pipeline = [{'$project': {'category': 1,
               'name': 1,
               'w': {'$cond': [{'$eq': ['$category', 'B']},
                               1,
                               {'$cond': [{'$eq': ['$category', 'C']},
                                          2,
                                          3]
                               }]
                    }
            }},
            {'$sort': {'w': 1}}
]

Model.aggregate(*pipeline)

答案 1 :(得分:1)

我认为仍然无法在MongoDB中提供自定义排序功能:

作为一种解决方法,您可以在Python中进行排序,将类别映射到实际用于对文档进行排序的数值:

from pprint import pprint

weights = {
    "A": 2,
    "B": 0,
    "C": 1
}

docs = db.col.find()
pprint(sorted(docs, key=lambda item: weights.get(item["category"])))