【问题标题】:How to quickly fetch all documents MongoDB pymongo如何快速获取所有文档 MongoDB pymongo
【发布时间】:2017-09-22 01:04:52
【问题描述】:

目前我通过在pymongo中遍历游标来获取文档,例如:

for d in db.docs.find():
    mylist.append(d)

作为参考,对同一组数据(7m 条记录)执行 fetchall 大约需要 20 秒,而上述方法需要几分钟。

在 mongo 中读取批量数据有更快的方法吗?抱歉,我是 mongo 新手,如果需要更多信息,请告诉我。

【问题讨论】:

    标签: python mongodb pymongo nosql


    【解决方案1】:

    使用 $natural 排序将绕过索引并按照文档在磁盘上的存储顺序返回文档,这意味着 mongo 不必在磁盘上随机读取。

    https://docs.mongodb.com/manual/reference/method/cursor.sort/#return-natural-order

    如果要使用查询,性能会严重下降。您永远不应该依赖 FIFO 排序。 Mongo 允许自己在其存储层内移动文档。如果您不在乎顺序,那就这样吧。

    此排序是内部实现功能,您应该 不依赖于 i 中的任何特定结构

    for d in db.docs.find().sort( { $natural: 1 } ):
        mylist.append(d)
    

    在 python 中,您还想使用 EXHAUST 游标类型,告诉 mongo 服务器无需等待 pymongo 驱动程序确认每个批次即可返回结果

    https://api.mongodb.com/python/current/api/pymongo/cursor.html#pymongo.cursor.CursorType.EXHAUST

    请注意,它永远不会像 shell 一样快。在 mongo/bson->pymongo->you 之间移动数据的最慢方面是 python 中的 UTF8 字符串解码。

    【讨论】:

    • 谢谢,使用自然标志肯定有帮助。
    • 太棒了。感谢您的指导。
    【解决方案2】:

    您只需要使用list() 函数进行强制转换

    pymongo_cursor = db.collection.find()
    all_data = list(pymongo_cursor)
    

    【讨论】:

    • 这不适用于大型集合,只是对编程器隐藏了迭代。
    • 为我工作。非常感谢。
    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 2016-10-22
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多