3

我想按升序对某个键的 MongoDB 集合进行排序,并且需要没有键的记录排在最后。例如

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

4 回答 4

3

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

于 2013-05-29T09:06:24.893 回答
3

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

  1. MinKey(内部类型)
  2. 空值
  3. 数字(整数、长整数、双精度数)
  4. 符号,字符串
  5. 目的
  6. 大批
  7. 二进制数据
  8. 对象 ID
  9. 布尔值
  10. 日期、时间戳
  11. 正则表达式
  12. MaxKey(内部类型)

当 mongo 生成索引时,它将为那些没有获得密钥的文档包含一个空值。您可以使用两个查询来完成,第一个使用备用索引。

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

于 2013-05-29T11:36:16.827 回答
1

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

在两个常规查询中使用$exist.

于 2013-05-30T05:17:47.953 回答
0

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

于 2018-11-20T17:48:07.400 回答