sql >> データベース >  >> NoSQL >> MongoDB

mongoimportを使用して、csvデータをmongodbの配列としてインポートします

    私にとって、mongoimport用に「CSV」をフォーマットする方法を理解する最も簡単な方法 コレクションを作成してからmongoexportを使用するだけです。 その上で、CSV形式がどのように表示されるかを確認します。

    したがって、シェルからドキュメントを作成します。

    db.newcol.insert({
      id:"122234343",
      name: "name1",
      children: ["222334444","333344444"]
    })
    

    次に、シェルを終了してmongoexportを実行します :

     mongoexport -d test -c testcol --fields id,name,children --type csv > out.csv
    

    これにより、出力は次のように表示されます:

    id,name,children
    122234343,name1,"[""222334444"",""333344444""]"
    

    「配列」が「文字列」で表され、引用符を使用している場合"" エスケープされた形で。

    これで、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 = [];
    }
    

    つまり、$typeを介して「文字列」であるBSONタイプが2のコレクションにインポートされたものをすべて繰り返します。 クエリ演算子。

    次に、文字列を取得し、配列として分割し、他の文字を削除して、必要な値のみを残します。

    .bulkWrite()を使用する リクエストごとにすべてのドキュメントを書き込むのではなく、効率的な方法でこれらの更新をコミットします。実際には、1000のバッチでサーバーに送信されます。

    最終結果は、元の必要な形式のドキュメントです:

    db.testcol.findOne()
    {
            "_id" : ObjectId("5947652ccb237bd6e4e902a5"),
            "id" : "122234343",
            "name" : "name1",
            "children" : [
                    "222334444",
                    "333344444"
            ]
    }
    

    これが、CSV形式を作成し、インポートしてから、データを必要な状態に「変換」する方法の「ステップバイステップ」です。



    1. 一度に多くのリクエストがあった場合、Redisは更新されません

    2. DBとredisキャッシュ間でデータを同期するための最良の戦略は何ですか

    3. Windowsでmongodbを起動する方法

    4. MongoDB $ toDate