2017-06-19 34 views
1

mongoimportを使用してcsvデータをmongodbにインポートしようとしました。コレクションは、このようなものです:私が試したmongoimportを使用してmongodbの配列としてcsvデータをインポートします。

{ 
id:"122234343", 
name: "name1", 
children: ["222334444","333344444"] 
} 

一つのアプローチは、2つのCSVファイルを作成することです - ID &名前とIDを持つ他、子供(idは2人の子供を持っているならば、それは2つの行を持つことになります)を持つものを。 mongoimportを使用して2つの異なるコレクションにデータをインポートし、子データを持つ2番目のコレクションでforeach()を使用してコレクションデータを更新します。

この「子」配列をCSVから直接読み込む方法はありますか?

答えて

1

私にとっては、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形式をうまくして、「変換」することができますどのように私の「ステップバイステップ」ですがあなたが必要とする状態にデータを変換します。

+0

ありがとう@Neil Lunn ..これは私のために働く。 –

1

コレクションは、以下のようなものです:コマンド以下

{ 
     "_id" : ObjectId("580100f4da893943d393e909"), 
     "username" : "crystal", 
     "likes" : [ "running", "pandas", "software development" ] 
    } 

MongoDBのためのCSV用:

mongoimport --db users --type csv --headerline --file /opt/backups/contacts.csv 

実際にMongoDBは非リレーショナルDBではありませんので、

をインポートするには、2つのCSVファイルを作成する必要
+0

Vishalに感謝しますが、CSV形式でこの「お気に入り」のデータを保持するために使用するフォーマットは何ですか? –

+0

あなたの要件に基づいて任意の種類のデータを保持することができます –

関連する問題