web-dev-qa-db-ja.com

MongoDBでコレクションをCSVにエクスポートする方法は?

MongoDBコレクションのすべてのレコードを.csvファイルにどのようにエクスポートしますか?

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

これにより、エクスポートする必要があるフィールドの名前を指定するように求められます。フィールドの名前を指定せずにすべてのフィールドをエクスポートできますか?

84
Succeed Stha

@ karoly-horvathが正しい。 csvにはフィールドが必要です。

MongoDB課題トラッカーのこのバグによると https://jira.mongodb.org/browse/SERVER-4224csvにエクスポートするときにフィールドを提供する必要があります。ドキュメントは明確ではありません。それがエラーの理由です。

これを試して:

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\" "`

バージョン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
91
campeterson

また、コンマで区切られたフィールド名の間にスペースを入れることはできません。

悪い:-f firstname, lastname

良い:-f firstname,lastname

50
murphsp1
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ダンプを出力することはできません。

固定スキーマがある場合は、1つのドキュメントを取得し、スクリプトを使用してそのドキュメントからフィールド名を取得し、mongoexportに渡すことができます。

26
Karoly Horvath

必要に応じて、--fieldsを指定せずにすべてのコレクションをcsvにエクスポートできます(すべてのフィールドをエクスポートします)。

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;
9
Michael

Mongoexportでこれを行うことができませんでした。すべてのフィールドの完全なリストを取得するには、コレクション全体を1回ループする必要があることがわかりました。これを使用してヘッダーを生成します。次に、コレクションを再度ループして、各ドキュメントにこれらのヘッダーを追加します。

これを行うためのスクリプトを作成しました。個々のドキュメント間のスキーマの違いに関係なく、MongoDBドキュメントをcsvに変換します。

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

3

以下のコマンドを使用して、コレクションをCSV形式にエクスポートします。

注:naagはデータベース、employee1_jsonはコレクションです。

mongoexport --db naag--collection employee1_json --type csv --out /home/orienit/work/mongodb/employee1_csv_op1
0
Naag

また、内部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""]"

注:配列をエクスポートしないでください。上記のフィールドuserIdsのようなCSV形式が破損します

0