将Mongo数据库转储到一个csv文件中

时间:2017-01-12 08:42:19

标签: python mongodb csv pandas pymongo

我想在一个csv / excel文件上转储Mongo数据库的数据。 我的数据库有几个具有相同字段和嵌入字段的文档。我希望每个嵌入字段都是我的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()中再次使用projection参数,这次只是为了给出csv文件的字段/列的顺序。实际上,投影是一个字段列表,第一个字段将是第一个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文件。

感谢您的帮助,

Matias

1 个答案:

答案 0 :(得分:0)

您可以使用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