【问题标题】:Dump a Mongo data base in one csv file将 Mongo 数据库转储到一个 csv 文件中
【发布时间】:2017-05-27 06:52:37
【问题描述】:

我想将 Mongo 数据库的数据转储到一个 csv/excel 文件中。 我的数据库有几个具有相同字段和嵌入字段的文档。我希望每个嵌入字段是我的 csv 文件的一列,每个文档是一行。 这是目标:

a_cursor = a_collection.find(filter, projection)  # pymongo.collection.find() method
a_csv_file = print_cursor_to_csv(a_cursor,projection)  # the method I would like to create
  • 使用 find() 的 filter 参数,我将能够过滤 mongo 文档。
  • 使用 find() 的投影参数,我将选择要放入 csv 列的字段。
  • 在 print_cursor_to_csv() 中再次使用了投影参数,这一次只是为了给出 csv 文件的字段/列的顺序。实际上,projection 是一个字段列表,第一个字段将是第一个 csv 列。

这是我写的方法:

def _print_cursor_in_csv(cursor, fields_to_show_order):
    """

    :param cursor: pymongo.Cursor. The list of documents to print into csv.
    :param fields_to_show_order: List of String. Permits to know the order of columns chosen by the user.
            Example : BaseStation_ID as first columns, then frequency of utilisation etc..
    """
    flattened_cursor = []
    for a_document in cursor:
        flattened_cursor.append(_flatten_the_dict(a_document))
    string_csv = _get_string_csv_from_list_of_dicts(flattened_cursor, fields_to_show_order)
    _write_a_file_from_a_string("testCSV"+".csv", string_csv)  # PRINT CSV OF A DOC

我的方法有效,但很大,我想更多地依赖 python 库,例如 pandas、openpyxl 或 csv。也许他们中的一个人可以在扁平化每个字典后从字典列表中编写一个 csv 文件。

感谢您的帮助,

马蒂亚斯

【问题讨论】:

    标签: python mongodb csv pandas pymongo


    【解决方案1】:

    您可以使用 mongoexport 来执行此操作。这是一个将收集流量中的所有数据从数据库测试转储到 csv 文件的示例。 (从 3.0 版开始。mongo 删除了 --csv 选项请使用 --type=csv)

    mongoexport --db test --collection traffic --type=csv --out traffic.csv
    

    如果您想减少记录的数量,您可以通过查询要转储的数据来做到这一点。只需使用 -q 添加一个查询,例如:

    --query '{"field": 1}'
    

    如果您只想导出某些字段,您可以添加以下选项(对于 csv,您必须提供字段列表):

    --fields <field1,field2>
    

    请确保逗号后没有空格。带有空格的字段仍以逗号分隔,没有前导或尾随空格,但您必须将完整列表放在引号中(文档对此有点不清楚)。

    如果您想获得一个嵌入的特殊字段,您可以通过以下方式解决此问题:

    --fields "field1,toplevelFieldName.0.field2"
    

    请注意,有一个“0”作为元素的索引。 monogexport 无法将所有元素导出到 csv 顶部,因此您需要一一解决它们,这是不现实的。或者您使用$unwind 将数据保存到另一个集合中,然后您可以将其导出。

    如果您不介意获取可以使用的完整嵌入文档:

    -- fields "field1,toplevelFieldName"
    

    toplevelFieldName 是嵌入文档的名称。

    关于 mongoexport 的完整文档可以在 here 找到。

    【讨论】:

    • 谢谢,确实容易多了。我还有两个额外的问题:尝试使用 mongoexport --authenticationMechanism SCRAM-SHA-1 进行身份验证时,我收到错误消息:2017-01-13T09:25:27.625+0100 User Assertion: 2:SCRAM-SHA-1 mechanism support not compiled into client library. 我有 mongoexport 2.6.10。第二个问题:在我的数据库中,我有一些字段是字典列表,每个字典都有相同的两个字段 x 和 y。我想导出这些数据,以便获取每个文档的列标题中的 x 值和相关单元格中的 y 值。再次感谢
    • 自 3.0 版以来,MongoDB 不再默认使用 MONGODB-CR,而是使用 SCRAM-SHA-1 作为默认身份验证机制。旧版本可以使用--authenticationMechanism MONGODB-CR
    猜你喜欢
    • 2018-04-02
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2011-08-30
    • 1970-01-01
    • 2013-02-08
    相关资源
    最近更新 更多