Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

@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

UPDATE:

Эта фиксация: 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\" "`

Ответ 2

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

BAD: -f firstname, lastname

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

Ответ 3

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.

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

Ответ 4

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

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

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;

Ответ 5

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

Я написал script, чтобы сделать это. Преобразование документов MongoDB в csv независимо от различий схемы между отдельными документами.

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

Ответ 6

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

Запись 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, например, полевые пользовательские идентификаторы, показанные выше