Як експортувати колекцію до CSV у MongoDB?


100

Як експортувати всі записи з колекції MongoDB у .csvфайл?

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

Після цього я прошу вказати назву полів, які мені потрібно експортувати. Чи можу я просто експортувати всі поля, не вказуючи назви полів?

Відповіді:


114

@ 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

16
У версії 3.0.6 mongoexportговоритьcsv flag is deprecated; please use --type=csv instead
Roman Dibikhin

Дякую (анонімному) за редакцію ВЕРСІЯ 3.0 І НАД.
campeterson

4
чи є швидкий спосіб включити всі поля, а не називати кожне?
Kevz

53

Крім того, вам не дозволено пробіли між іменами полів, розділених комами.

БАД: -f firstname, lastname

ДОБРЕ: -f firstname,lastname


28
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 (). В іншому випадку мені доведеться отримати запис із хешами key: value.
Успіх 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-поля, використовуйте крапку (. Operator).

Запис JSON:

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

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

./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, ім'я


Чим це відрізняється від відповідей нижче?
Даніель В.

mongodump --host cluster0-shard.mongodb.net:27017 --db dbname --forceTableScan --out / var / www / html / documents / db-12-2020 --authenticationDatabase admin --ssl --username youruname - пароль ваш пароль ви можете спробувати це, також це дає вам цілі колекції.
manoj patel

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

-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 потрібен список полів
П’ятниця,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.