MongoDB中的自定义排序

时间:2013-05-29 06:24:30

标签: mongodb sorting

我想按升序对某个键上的MongoDB集合进行排序,并且需要没有该键的记录。 e.g。

db.coll.find({}, {key: 1}).sort({key: 1})

给出:

{_id: 1}
{_id: 2, key: 1}
{_id: 3, key: 2}

但应该提供以下内容:

{_id: 2, key: 1}
{_id: 3, key: 2}
{_id: 1}

有没有办法用MongoDB做到这一点?

4 个答案:

答案 0 :(得分:3)

这是不可能的。创建文档时,必须将“key”设置为理论上的最大值。或者,您可以执行两个查询(一个用于获取“key”存在的所有排序,以及一个没有设置“key”的可选其他查询,以便在需要时补充结果集)。由于各种业务规则限制,通常后者是不可能的。

答案 1 :(得分:3)

不幸的是mongoDB“在比较不同BSON类型的值时,MongoDB使用以下比较顺序,从最低到最高:”DOCS

  1. MinKey(内部类型)
  2. Null
  3. 数字(整数,长数,双数)
  4. 符号,字符串
  5. 对象
  6. 数组
  7. BinData
  8. ObjectID
  9. 布尔
  10. 日期,时间戳
  11. 正则表达式
  12. MaxKey(内部类型)
  13. 当mongo生成索引时,对于那些没有获得密钥的文档,它将包含null。 您可以使用两个查询来完成,第一个使用备用索引。

    如果在关键字段上定义备用索引,则排序将仅返回具有值的索引。这个将排除没有密钥的文档。 DOCS

答案 2 :(得分:1)

这可以使用聚合框架来完成,但这会非常痛苦。您必须使用高于有效密钥的标记值替换丢失的密钥(通过使用在您拥有的密钥类型之后排序的类型的密钥很容易,除非密钥是正则表达式),然后对集合进行排序,然后去除标记值。

使用$exist在两个常规查询中执行此操作会更有效。

答案 3 :(得分:0)

我有一个类似的问题: 我需要按其中包含数字的文本进行排序,并且数字应在字符串之后显示。 我们现在看到的唯一方法是创建一个索引字段,在该字段中,数字被字符替换,以便将它们排在字符串之后。