我知道如何通过多个字段对MongoDB中的查询进行排序,例如db.coll.find().sort({a:1,b:-1})
。
我可以使用用户定义的函数进行排序;例如,假设a和b是整数,通过a和b之间的差异(a-b)
?
谢谢!
答案 0 :(得分:30)
更新:此答案似乎已过期;通过在排序之前使用$project
function of the aggregation pipeline转换输入文档,似乎可以或多或少地实现自定义排序。另见@ Ari的答案。
我认为这不可能直接; sort documentation当然没有提及任何提供自定义比较功能的方法。
您可能最好在客户端进行排序,但如果您真的决心在服务器上执行此操作,则可以使用db.eval()
来安排在服务器上运行排序(如果您的客户支持它。)
服务器端排序:
db.eval(function() {
return db.scratch.find().toArray().sort(function(doc1, doc2) {
return doc1.a - doc2.a
})
});
与等效的客户端排序:
db.scratch.find().toArray().sort(function(doc1, doc2) {
return doc1.a - doc2.b
});
请注意,也可以通过aggregation pipeline和$orderby
operator(即.sort()
除外)进行排序,但这些方法都不允许您提供自定义排序功能。
答案 1 :(得分:16)
进入这个,这就是我提出的:
db.collection.aggregate([
{
$project: {
difference: { $subtract: ["$a", "$b"] }
// Add other keys in here as necessary
}
},
{
$sort: { difference: -1 }
}
])
答案 2 :(得分:11)
为什么不使用此操作创建字段并对其进行排序?