【问题标题】:In MongoDB, is db.collection.find() same as db.collection.find().sort({$natural:1})?在 MongoDB 中,db.collection.find() 是否与 db.collection.find().sort({$natural:1}) 相同?
【发布时间】:2015-02-28 00:21:45
【问题描述】:

我确定这很容易,但我只是想确定一下。 find() 与一些搜索和投影标准是否与在其上应用 sort({$natural:1}) 相同?

另外,默认的自然排序顺序是什么?比如,它与sort({_id:1}) 有何不同?

【问题讨论】:

    标签: mongodb sorting pymongo


    【解决方案1】:

    db.collection.find() 的结果与db.collection.find().sort({$natural:1}) 相同

    {"$natural" : 1} 强制查找查询进行表扫描(默认排序),它在用于排序时指定硬盘顺序

    当您更新文档时,mongo 可以将您的文档移动到硬盘的另一个位置。

    例如插入文档如下

    {
        _id : 0, 
    },
    {
        _id : 1, 
    }
    

    然后更新:

    db.collection.update({ _id : 0} , { $set : { blob : BIG DATA}})
    

    当你执行 find 查询时,你会得到

    {
        "_id" : 1
    },
    {
        "_id" : 0,
        "blob" : BIG DATA
    }
    

    如您所见,文档的顺序已更改 => 默认顺序不是按 _id

    【讨论】:

    • 也就是说,假设我在生产设置上进行了find() 查询,然后有一个光标,然后几天后,我再做一次find() 并得到另一个游标,这两个游标中的文档顺序会有所不同吗?当然,假设文档有很多更新。
    • 如果您更新您的文档并且更新查询导致移动其中的一些,是的,您会得到不同的结果(顺序不同)。
    【解决方案2】:

    如果您不指定排序,则 mongodb find() 将按照文档存储在磁盘上的顺序返回文档。磁盘上的文档存储可能与插入顺序一致,但并非总是如此。还值得注意的是,磁盘上文档的位置可能会发生变化。例如,在更新的情况下,mongodb 可能会根据需要将文档从一个地方移动到另一个地方。

    如果是索引 - 如果查询使用索引,默认顺序将是找到索引的顺序。

    $natural 是在磁盘上找到文档的顺序。

    建议您明确指定排序以确保排序顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 2013-10-15
      相关资源
      最近更新 更多