Mongo复杂排序?

时间:2010-07-09 13:19:24

标签: mongodb

我知道如何通过多个字段对MongoDB中的查询进行排序,例如db.coll.find().sort({a:1,b:-1})

我可以使用用户定义的函数进行排序;例如,假设a和b是整数,通过a和b之间的差异(a-b)

谢谢!

3 个答案:

答案 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)

为什么不使用此操作创建字段并对其进行排序?