我有一个包含以下数据结构的集合:
[{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
答案 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"])))