当前位置:  开发笔记 > 数据库 > 正文

Mongo复杂排序?

如何解决《Mongo复杂排序?》经验,为你挑选了3个好方法。

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

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

谢谢!



1> mjs..:

更新:这个答案似乎已经过时了; 似乎可以通过使用$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())进行排序,但这两种方法都不允许您提供自定义排序功能.


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

2> Ari..:

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

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



3> shingara..:

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


我仍然需要单独访问a和b.所以我必须创建第三个字段.这对我的申请有用,但作为一般原则,这将是非常糟糕的政策.假设我有几个整数字段,会有派生属性(ab),(ac),(ad)的组合爆炸...即使只有这样一个字段,它也真的浪费空间,特别是对于大型集合.我赞成,如果没有其他人回答接受,但必须有一个更好的方法.在SQL中,这就像`SELECT*FROM coll ORDER BY(ab)`一样简单.
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有