私にとっては、012のための "CSV"のフォーマット方法を理解する最も簡単な方法は単にコレクションを作成し、その上にmongoexport
を使用してCSV形式の外観を確認するだけです。
だから、シェルからドキュメントを作成します。
db.newcol.insert({
id:"122234343",
name: "name1",
children: ["222334444","333344444"]
})
その後、シェルを終了し、mongoexport
を実行します。
id,name,children
122234343,name1,"[""222334444"",""333344444""]"
:としてあなたの出力を表示します
mongoexport -d test -c testcol --fields id,name,children --type csv > out.csv
「配列」は「文字列」で表され、引用符は""
彼らのエスケープされた形で。今からmongoimport
を使用するには、かなり明確な場所です
、これだけ「インポート」今テストへ:
mongoimport -d test -c newcol --headerline --type csv out.csv
シェルを再入力して、新しいコレクション内の文書を参照してください。
を
db.newcol.findOne()
{
"_id" : ObjectId("59476924d6eb0b7d6ac37e02"),
"id" : 122234343,
"name" : "name1",
"children" : "[\"222334444\",\"333344444\"]"
}
だから、すべてがそこにある、しかし子どもたちは、「文字列」のではなく配列として記載されています。
var ops = [];
db.testcol.find({ "children": { "$type": 2} }).forEach(doc => {
var children = doc.children.split(',').map(e => e.replace(/"|\[|\]|\\/gm,'').toString());
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "children": children } }
}
});
if (ops.length >= 1000) {
db.newcol.bulkWrite(ops);
ops = [];
}
});
if (ops.length > 0) {
db.newcol.bulkWrite(ops);
ops = [];
}
は、だからそれはBSONを持っているコレクションにインポートされたものを反復するために起こっている:我々はデータをインポートしてしまった今、それは今実際にそれを変換するために、私たち次第だけだからしかし、これは、実際には問題ではありません$type
クエリ演算子を介して "文字列"である2のタイプ。
次に、文字列を配列として分割し、他の文字を削除して、必要な値だけを残します。
.bulkWrite()
を使用すると、リクエストごとにすべてのドキュメントを書き込むのではなく、効率的な方法でコミットします。それらは実際には1000のバッチでサーバーに送信されます。
最終結果元で文書がフォーム望まれる:
db.testcol.findOne()
{
"_id" : ObjectId("5947652ccb237bd6e4e902a5"),
"id" : "122234343",
"name" : "name1",
"children" : [
"222334444",
"333344444"
]
}
だから、あなたがそれをインポートし、あなたのCSV形式をうまくして、「変換」することができますどのように私の「ステップバイステップ」ですがあなたが必要とする状態にデータを変換します。
ありがとう@Neil Lunn ..これは私のために働く。 –