我知道如何通过多个字段对MongoDB中的查询进行排序,例如db.coll.find().sort({a:1,b:-1})
.
我可以使用用户定义的函数进行排序; 例如,假设a和b是整数,由a和b之间的差异(a-b)
?
谢谢!
更新:这个答案似乎已经过时了; 似乎可以通过使用$project
聚合管道的功能在排序之前转换输入文档来或多或少地实现自定义排序.另见@ Ari的答案.
我认为这不可能直接; 在排序文件肯定没有提到任何方式提供自定义比较功能.
您最好在客户端进行排序,但如果您真的决定在服务器上执行此操作,则可以使用它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 });
请注意,也可以通过聚合管道和$orderby
操作员(即除此之外.sort()
)进行排序,但这两种方法都不允许您提供自定义排序功能.
进入这个,这就是我提出的:
db.collection.aggregate([ { $project: { difference: { $subtract: ["$a", "$b"] } // Add other keys in here as necessary } }, { $sort: { difference: -1 } } ])
为什么不使用此操作创建字段并对其进行排序?