Mongo复杂排序?

gil*_*esc 33 mongodb

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

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

谢谢!

mjs*_*mjs 30

更新:这个答案似乎已经过时了; 似乎可以通过使用$project聚合管道功能在排序之前转换输入文档来或多或少地实现自定义排序.另见@ Ari的答案.

我认为这不可能直接; 在排序文件肯定没有提到任何方式提供自定义比较功能.

您最好在客户端进行排序,但如果您真的决定在服务器上执行此操作,则可以使用它db.eval()来安排在服务器上运行排序(如果您的客户端支持它).

服务器端排序:

db.eval(function() { 
  return db.scratch.find().toArray().sort(function(doc1, doc2) { 
    return doc1.a - doc2.a 
  }) 
});
Run Code Online (Sandbox Code Playgroud)

与等效的客户端排序相对应:

db.scratch.find().toArray().sort(function(doc1, doc2) { 
  return doc1.a - doc2.b 
});
Run Code Online (Sandbox Code Playgroud)

请注意,也可以通过聚合管道$orderby操作员(即除此之外.sort())进行排序,但这两种方法都不允许您提供自定义排序功能.

  • 对.在进一步挖掘之后,我发现有一个RFE归档,允许便利功能完成此操作.对于我的~10m文件,我绝对不喜欢`toArray()`的外观,但这显然是事态. (2认同)

Ari*_*Ari 17

进入这个,这就是我提出的:

db.collection.aggregate([
  { 
    $project: {
      difference: { $subtract: ["$a", "$b"] }
      // Add other keys in here as necessary
    }
  },  
  { 
    $sort: { difference: -1 } 
  }
])
Run Code Online (Sandbox Code Playgroud)


shi*_*ara 11

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

  • 我仍然需要单独访问a和b.所以我必须创建第三个字段.这对我的申请有用,但作为一般原则,这将是非常糟糕的政策.假设我有几个整数字段,会有派生属性(ab),(ac),(ad)的组合爆炸...即使只有这样一个字段,它也真的浪费空间,特别是对于大型集合.我赞成,如果没有其他人回答接受,但必须有一个更好的方法.在SQL中,这就像`SELECT*FROM coll ORDER BY(ab)`一样简单. (3认同)