2017-01-12 4 views
1

Я хотел бы сбросить данные базы данных Mongo в одном файле csv/excel. В моей базе данных есть несколько документов с одинаковыми полями и встроенными полями. Я хочу, чтобы каждое встроенное поле было одним столбцом моего файла csv, а каждый документ - одной строкой. Вот цель:Дамп базы данных 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() я выберу поля для ввода столбцов csv.
  • Аргумент проекции снова используется в print_cursor_to_csv(), на этот раз только для того, чтобы указать порядок полей/столбцов для файла 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 

Мой метод работает, но большой и я хотел бы больше полагаться на питона библиотек, таких как панд, openpyxl или CSV. Возможно, один из них может написать csv-файл из списка словарей после сглаживания каждого из них.

Спасибо за вашу помощь,

Матиас

ответ

0

Вы можете использовать mongoexport, чтобы сделать это. Вот пример, который сбрасывает все тестовые данные базы данных данных в трафике коллекции в файл csv. (Начиная с версии 3.0. Монго удалена --csv вариант Plase использовать --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.

+0

Спасибо, это действительно намного проще. У меня есть два дополнительных вопроса: При попытке аутентификации с помощью mongoexport --authenticationMechanism SCRAM-SHA-1, я получаю сообщение об ошибке: '2017-01-13T09: 25: 27.625 + 0100 Утверждение пользователя: 2: SCRAM-SHA-1 поддержка механизма не компилируется в клиентскую библиотеку. «У меня есть mongoexport 2.6.10. Второй вопрос: в моей базе данных есть несколько полей, которые являются списками словарей, причем каждый словарь имеет те же два поля, x и y. Я хотел бы экспортировать эти данные, чтобы получить значения x в заголовках столбцов и значениях y в связанных ячейках для каждого документа. Еще раз спасибо – Matias

+0

Поскольку Version 3.0 MongoDB больше не использует MONGODB-CR и вместо этого использует SCRAM-SHA-1 в качестве механизма аутентификации по умолчанию. Вы можете использовать '--authenticationMechanism MONGODB-CR' для более старых версий – MBushveld

Смежные вопросы