【问题标题】:How are null values in a MongoDB index sorted?MongoDB 索引中的空值如何排序?
【发布时间】:2016-03-13 18:42:29
【问题描述】:

我想以特定方式(-1, 1)对索引进行排序,并希望确保空值位于索引的顶部。如何确保这一点?

【问题讨论】:

  • 排序时,null 值将位于顶部,如果您希望它们排在最后,则需要在其中放入除 null 以外的其他内容
  • 谢谢。如果我使用 .findOne() 并且它们被编入索引,这是否也意味着它们将位于顶部?
  • findOne 只会找到一个文档。虽然它们应该在 find() 的顶部
  • 但是既然索引是这样排序的,不应该在最上面吗?
  • nahg findOne 不支持排序,只有 find 支持,您仍然需要在查询中对索引进行排序

标签: mongodb


【解决方案1】:

如果您正在降序排序并且您在末尾看到 null 值,那将是排序的默认行为。

实际上并没有太多可以改变这种行为的方法,但是可以为您提供所需结果的解决方法是执行两个查询而不是一个:

db.Collection.find( { a: null } );
db.Collection.find( { a: { $ne: null } } ).sort( { a: -1, b: 1 } );

【讨论】:

  • 我能否以某种方式创建反向排序索引并将其与 findOne 一起使用?所以它只是给了我一个空值,如果有任何空值?
  • @user1680104 findOne 不支持排序。但是,如果您有兴趣使用 findOne 查找空值,您可以执行类似 db.collection.findOne( { a: null } ) 的操作
  • 我知道。我只想通过一个查询基本上有一个“如果存在一个空值,则接受它,否则接受一个不存在”。
  • 另一种选择是创建布尔字段 has_a 并将其包含在类似 .sort({has_a: 1, a: -1, b: 1}) 的排序中。如果您只需要一个查询(例如,稍后对结果应用分页),这会很有帮助。您可能还希望将其包含在索引中(使用复合索引 {has_a: 1, a: -1} 而不是 {a: -1})。
【解决方案2】:

您已经说过“我只想通过一个查询基本上有一个'如果存在一个带有null的就拿它,否则就拿一个不带'”,db.collection.find().sort().limit(1 ) ?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2020-04-19
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多