【问题标题】:MongoDB sort() removes documents that don't contain sort filterMongoDB sort() 删除不包含排序过滤器的文档
【发布时间】:2013-08-01 11:56:58
【问题描述】:

我在使用 MongoDB 的 .sort() 时遇到问题,因为它会删除没有排序字段的文档。

例如,我有一个文档数组,有些包含“timeSent”字段,有些不包含:

db.foo.find() = 
    {
      "_id": { "$oid" : "51f25e497363055d1fde7524" },
      "eventID": 159,
      "timeSent": 1374844250464
    }
    {
      "_id": { "$oid" : "51f25e497363055d1fde7525" },
      "eventID": 158,
      "timeSent": 1374844250465
    }
    {
      "_id": { "$oid" : "51f25e497363055d1fde7526" },
      "eventID": 157
    }

使用 .sort() 删除不存在 'timeSent' 的文档。

db.foo.find().sort({ "timeSent": 1}).skip(0).limit(30)

我想知道 Mongo 中是否有一种方法可以像 SQL 一样返回完整的文档。 (对顶部的“timeSent existing”字段和底部的“timeSent not existing”进行排序。反之亦然,具体取决于 ASC 或 DESC)

谢谢

附言一直在尝试使用 MongoCursor 在 PHP 中实现这一点。

【问题讨论】:

  • 您是否尝试过从 mongo 的控制台进行查找和排序?我做了一个快速测试,结果中出现了缺少字段的文档。
  • 我会检查我的 mongoDB 版本是否是最新的,以及我是否使用了最新的驱动程序。即使排序键不存在,Mongo 排序命令也会返回文档。
  • 谢谢,我检查了该版本是 MongoDB 的最新版本。 - 当我确保索引时,我发现问题发生了。如果您使用以下命令尝试它,它会删除不存在密钥的位置。 db.foo.ensureIndex({'timeSent':1},{'unique':true,'sparse':true,'dropDups':true}) 有什么想法吗?
  • @Jason 解释它。这就是稀疏索引应该做的事情。您可能需要重新考虑您的索引。如果您想要该属性中的索引,您可以在没有该属性数据的文档上将其设置为 null。

标签: php javascript mongodb


【解决方案1】:

Mongo 可能在您之前定义的过滤字段上使用sparse 索引:在光标上使用explain 以确保。

您可以告诉 Mongo not to use that index,或者重建索引,包括没有键的字段(即您 create a non sparse index)。

(对不起之前的答案,我把它弄反了......)

【讨论】:

    猜你喜欢
    • 2021-02-25
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2020-05-25
    • 2015-09-17
    • 2013-09-14
    相关资源
    最近更新 更多