【问题标题】:Difficulty with document batch import, pymongo文档批量导入困难,pymongo
【发布时间】:2016-09-27 07:46:29
【问题描述】:

我遇到的困难比我想象的要从 Mongo 批量导入多个文档到 RAM 中要困难得多。我正在编写一个应用程序来通过pymongo 与 MongoDB 通信,该应用程序当前有 2GB,但在不久的将来可能会增长到超过 1TB。因此,一次将有限数量的记录批量读取到 RAM 中对于可扩展性很重要。

基于this postthis documentation,我认为这很简单:

HOST = MongoClient(MONGO_CONN)
DB_CONN = HOST.database_name
collection = DB_CONN.collection_name
cursor = collection.find()
cursor.batch_size(1000) 
next_1K_records_in_RAM = cursor.next()

但是,这对我不起作用。即使我有一个包含> 200K BSON对象的Mongo集合,这也会一次将它们作为单个字典读取,例如{_id : ID1, ...} 而不是我要查找的内容,这是表示我的集合中多个文档的字典的错误,例如[{_id : ID1, ...}, {_id : ID2, ...}, ..., {_id: ID1000, ...}]

我不认为这很重要,但我使用的是 python 3.5 而不是 2.7。

由于此示例引用了一个安全的远程数据源,因此这不是一个可重现的示例。对此表示歉意。如果您对如何改进问题有任何建议,请告诉我。

【问题讨论】:

    标签: python mongodb python-3.x pymongo


    【解决方案1】:
    • Python 版本在这里无关紧要,与您的输出无关。
    • Batch_size 仅定义 mongoDB 一次返回多少个文档 DB之旅(在某些限制下:see here here
    • collection.find 始终返回迭代器/游标或无。批处理透明地完成其工作) (如果没有找到文件,则后者)
    • 要检查您退回的文件 必须遍历光标,即

      For document in cursor: print (document)

      或者如果您想要文档列表:list(cursor)

      • 如果您需要重新访问文档,请记得发送cursor.rewind()

    【讨论】:

    • 好的,所以如果我想创建一个迭代器,它一次从本地 RAM 中的数据库返回 1000 个文档,我该怎么做?
    • collection.find({...}, limit=1000)
    • @nickmilon 我想limit=1000 只会从数据库返回 1000 个文档(然后光标将被耗尽)。如何按 1000 个批次迭代整个集合,以便 records.next() 将返回 len = 1000 的列表?
    • 没有 mongoDB 选项,但您可以在代码中处理它 a) 使用限制并在查询中使用一种分页机制重复查找。 b) l = list(db.collection.find({,,,}) sl = [l[x:x+1000] for x in range(0, len(l), 1000)] for i in sl:print (i) * 但请确保您的记忆力能够处理这些大列表
    猜你喜欢
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2015-05-16
    相关资源
    最近更新 更多