Как экспортировать коллекцию в CSV в MongoDB?

104

Как вы экспортируете все записи из коллекции MongoDB в .csvфайл?

mongoexport --host localhost --db dbname --collection name --type=csv > test.csv

Это просит меня указать имена полей, которые мне нужно экспортировать. Могу я просто экспортировать все поля без указания названий полей?

Успех Stha
источник

Ответы:

117

@ karoly-horvath прав. Поля обязательны для заполнения csv.

Согласно этой ошибке в системе отслеживания проблем MongoDB https://jira.mongodb.org/browse/SERVER-4224, вы ДОЛЖНЫ предоставить поля при экспорте в CSV . В документах это неясно. Это причина ошибки.

Попробуй это:

mongoexport --host localhost --db dbname --collection name --csv --out text.csv --fields firstName,middleName,lastName

ОБНОВИТЬ:

Этот коммит: https://github.com/mongodb/mongo-tools/commit/586c00ef09c32c77907bd20d722049ed23065398 исправляет документы для 3.0.0-rc10 и более поздних версий. Меняется

Fields string `long:"fields" short:"f" description:"comma separated list of field names, e.g. -f name,age"`

к

Fields string `long:"fields" short:"f" description:"comma separated list of field names (required for exporting CSV) e.g. -f \"name,age\" "`

ВЕРСИЯ 3.0 И ВЫШЕ:

Вы должны использовать --type=csvвместо, --csvпоскольку он устарел.

Подробнее: https://docs.mongodb.com/manual/reference/program/mongoexport/#export-in-csv-format

Полная команда:

mongoexport --host localhost --db dbname --collection name --type=csv --out text.csv --fields firstName,middleName,lastName
Campeterson
источник
16
По версии 3.0.6 mongoexportсказаноcsv flag is deprecated; please use --type=csv instead
Дибихин Роман
Спасибо (анониму) за редактирование ВЕРСИИ 3.0 И ВЫШЕ.
campeterson
4
есть ли быстрый способ включить все поля вместо именования каждого?
Kevz
53

Кроме того, нельзя использовать пробелы между именами полей, разделенных запятыми.

ПЛОХОЙ: -f firstname, lastname

ХОРОШИЙ: -f firstname,lastname

murphsp1
источник
27
mongoexport  --help
....
-f [ --fields ] arg     comma separated list of field names e.g. -f name,age
--fieldFile arg         file with fields names - 1 per line

Вы должны указать это вручную, и если подумать, это имеет смысл. MongoDB не имеет схемы; CSV, с другой стороны, имеет фиксированный макет для столбцов. Не зная, какие поля используются в разных документах, вывести дамп CSV невозможно.

Если у вас есть фиксированная схема, возможно, вы могли бы получить один документ, собрать из него имена полей с помощью сценария и передать его в mongoexport.

Кароли Хорват
источник
1
Я просто искал, могу ли я получить список полей из записи. то есть из db.collection.finOne (). getFields (). Но я думаю, это неправильный метод (getFields). Я тоже пробовал getKeys (). В противном случае мне нужно будет получить запись с хешами ключ: значение.
Succeed Stha
Я пытаюсь сделать то же самое, но чтобы выяснить, почему он не импортирует файлы csv должным образом. В моем случае мне нужно, чтобы он рассказывал мне все о себе, в том числе о том, какие поля он «изобрел» сам. Так что в моем случае нет смысла указывать поля, потому что я не знаю, что они все!
Стивен
Что касается сценария уборки поля, я опубликовал его примерно год назад, может дать вам несколько идей.
arober11
9

При желании можно экспортировать все коллекции в csv без указания --fields(экспортируются все поля).

Из http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/ запустите этот сценарий bash

OIFS=$IFS;
IFS=",";

# fill in your details here
dbname=DBNAME
user=USERNAME
pass=PASSWORD
host=HOSTNAME:PORT

# first get all collections in the database
collections=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();db.getCollectionNames();"`;
collections=`mongo $dbname --eval "rs.slaveOk();db.getCollectionNames();"`;
collectionArray=($collections);

# for each collection
for ((i=0; i<${#collectionArray[@]}; ++i));
do
    echo 'exporting collection' ${collectionArray[$i]}
    # get comma separated list of keys. do this by peeking into the first document in the collection and get his set of keys
    keys=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();var keys = []; for(var key in db.${collectionArray[$i]}.find().sort({_id: -1}).limit(1)[0]) { keys.push(key); }; keys;" --quiet`;
    # now use mongoexport with the set of keys to export the collection to csv
    mongoexport --host $host -u $user -p $pass -d $dbname -c ${collectionArray[$i]} --fields "$keys" --csv --out $dbname.${collectionArray[$i]}.csv;
done

IFS=$OIFS;
Майкл
источник
4
Единственная проблема с приведенным выше сценарием заключается в том, что он предполагает, что первый документ в каждой коллекции содержит все возможные ключи, которые могут появиться в документе в этой коллекции; чего не может быть, если тип документа может содержать массив или вложенный поддокумент.
arober11
@ arober11 ты прав, забыл упомянуть этот важный факт. Что я обычно делаю, так это запускаю сценарий уменьшения карты, чтобы периодически собирать все ключи и использовать его для извлечения всех ключей
Майкл
3

Я не мог заставить mongoexport сделать это за меня. Я обнаружил, что для получения исчерпывающего списка всех полей вам нужно один раз пройти через всю коллекцию. Используйте это для создания заголовков. Затем снова прокрутите коллекцию, чтобы заполнить эти заголовки для каждого документа.

Для этого я написал сценарий. Преобразование документов MongoDB в csv независимо от различий в схемах отдельных документов.

https://github.com/surya-shodan/mongoexportcsv

Сурьякумар Судар
источник
2

Также, если вы хотите экспортировать внутренние поля json, используйте точку (оператор.).

Запись JSON:

{
    "_id" : "00118685076F2C77",
    "value" : {
        "userIds" : [ 
            "u1"
        ],
        "deviceId" : "dev"
}

Команда mongoexport с оператором точки (с использованием mongo версии 3.4.7):

./mongoexport --host localhost --db myDB --collection myColl --type = csv --out out.csv --fields value.deviceId, value.userIds

Выходной CSV:

value.deviceId,value.userIds
d1,"[""u1""]"
d2,"[""u2""]"

Примечание. Убедитесь, что вы не экспортируете массив. Это повредит формат CSV, такой как поля userIds, показанные выше

Локендра Чаухан
источник
0

Решение для пользователей MongoDB Atlas!

Добавьте --fieldsпараметр в виде разделенных запятыми имен полей, заключенных в двойные кавычки:

--fields "<FIELD 1>,<FIELD 2>..."

Это полный пример:

mongoexport --host Cluster0-shard-0/shard1URL.mongodb.net:27017,shard2URL.mongodb.net:27017,shard3URL.mongodb.net:27017 --ssl --username <USERNAME> --password <PASSWORD> --authenticationDatabase admin --db <DB NAME> --collection <COLLECTION NAME> --type <OUTPUT FILE TYPE> --out <OUTPUT FILE NAME> --fields "<FIELD 1>,<FIELD 2>..."
Замир Ансари
источник
0

Это работает для меня Попробуйте

mongoexport --host cluster0-shard-dummy-link.mongodb.net:27017 --db yourdbname --forceTableScan   --collection users --type json --out /var/www/html/user.json --authenticationDatabase admin --ssl --username Yourusername --password Yourpassword

Выше cmd возвращают все данные коллекции пользователей, если вам нужно поле фильтра, затем добавьте --fields = email, name

Маной Патель
источник
Чем это отличается от ответов ниже?
Дэниел В.
mongodump --host cluster0-shard.mongodb.net:27017 --db dbname --forceTableScan --out / var / www / html / documents / db-12-2020 --authenticationDatabase admin --ssl --username youruname - пароль yourpassword вы можете попробовать это также дает вам целые коллекции.
Манодж Патель,
0

у меня работает удаленное подключение к контейнеру докеров с помощью mongo: 4.2.6

mongoexport -h mongodb:27017 --authenticationDatabase=admin -u username -p password -d database -c collection -q {"created_date": { "$gte": { "$date": "2020-08-03T00:00:00.000Z" }, "$lt": { "$date": "2020-08-09T23:59:59.999Z" } } } --fields=somefield1,somefield2 --type=csv --out=/archive.csv
user739313
источник
-1

Для всех, кто застрял с ошибкой.

Позвольте мне дать вам решение с кратким объяснением того же: -

команда для подключения: -

mongoexport --host your_host --port your_port -u your_username -p your_password --db your_db --collection your_collection --type=csv --out file_name.csv --fields all_the_fields --authenticationDatabase admin

--host -> хост сервера Mongo

--port -> порт сервера Mongo

-u -> имя пользователя

-p -> пароль

--db -> db, из которого вы хотите экспортировать

--collection -> коллекция, которую вы хотите экспортировать

--type -> тип экспорта в моем случае CSV

--out -> имя файла, в который вы хотите экспортировать

--fields -> все поля, которые вы хотите экспортировать (не ставьте пробелы между двумя именами полей между запятыми в случае CSV)

--authenticationDatabase -> база данных, в которой хранится вся ваша пользовательская информация

чиновник
источник
-2

Команда ниже используется для экспорта коллекции в формат CSV.

Примечание: naagэто база данных, employee1_jsonэто коллекция.

mongoexport --db naag--collection employee1_json --type csv --out /home/orienit/work/mongodb/employee1_csv_op1
Нааг
источник
это то, что возвращает mongodb 4: Ошибка: для режима CSV требуется список полей
ПЯТНИЦА