2016-12-21 9 views
1

私は3から30kbの範囲の350万のjsonファイルを持つWindowsマシンに1つのディレクトリを持っています。私はいくつかの機能を持っている:ノードからmongoDBへの一括挿入

myBuilder(json){ 
     //some stuff producing an object named entry 
     return entry 
} 

私がやりたいことのすべては、ディレクトリ内のすべてのファイルを読み込まれ、myBuilderを介してそれらを実行し、モンゴデータベースにそれらのすべてを挿入します。私は下に私の最高の試みを掲載しました。

希望の結果を得る最も簡単な方法は何ですか?

注:

  1. 私はエントリを保持する単一のアレイは、私の使用可能なRAMを超えてしまうようチャンクにこの操作を破る方法を構築する必要があるためinsertManyが複雑になり得ると考えています。
  2. グロブが動作しないようです。 Windowsベースの制限ですか?それはメモリベースの制限ですか?いずれにせよ、私はglobを使って答えを避けたいと思います。
  3. データベースに接続する単一インスタンス内で多くの連続したinsertOne操作を実行する方が好都合かどうか、または毎回接続と切断を行う必要があるかどうかを説明する人には本当に感謝しています。

サンプルコード:

var fs = require('fs'); 
var mongodb = require('mongodb'); 
var MongoClient = mongodb.MongoClient; 
var MongoURL = 'mongodb://localhost:27017/my_database_name'; 
traverseFileSystem('/nodejs/nodetest1/imports'); 

function traverseFileSystem(path){ 
    var files = fs.readdirSync(currentPath); 
    for (var i in files) { 
     var currentFile = path + '/' + files[i]; 
     var stats = fs.statSync(currentFile); 
     if (stats.isFile()){ 
      var fileText = fs.readFileSync(currentFile,'utf8'); 
      var json= JSON.parse(fileText); 
      var entry = myBuilder(json); // note this is described above 
      insertToMongo(entry); 
     } 
    } 
} 
function insertToMongo(entry){ 
    console.log(entry); 
    MongoClient.connect(MongoURL, function (err, db) { 
     var collection = db.collection('users');  
     collection.insert(entry, function (err, result) { 
      if(err) 
       console.log("error was"+err); 
      else 
       console.log("entry was"+result); 
      db.close(); 
     }); 
    }); 
} 

これが通る(およびコンソールへのログは)良く、ディレクトリ内のすべてのファイルのエントリがフォーマットされています。しかし、それは肯定的なエラーや結果を結果として表示しません。 Mongoは接続が行われたことを示し、エラーを表示しません。

+0

それを一つずつ挿入する実際の問題は何ですか? –

+0

私は、一連のinsertOne操作で問題なく動作します。私の問題は、これを実際に動かすようには思えないということです。注3の答えと何か関係がありますか? – COMisHARD

+0

["動作しません"は問題ありません] –

答えて

0

すべての挿入にdb接続を再利用したい場合があります。接続プロセスは、msの量を消費します。大量のファイルをインポートする場合は、特に保存することができます。

一度に1つ以上のドキュメントを挿入する場合は、bulk operationsを使用できます。すなわち、10個のファイルを読み込み、 "一括"して実行するようなループを使用します。同じdb接続を使用する。

あなたはimport all .json files within a directoryにあなたの端末からmongoimportを使用することができます:あなたはmongoimport検討することもできた場合


@echo off 
for %%f in (*.json) do (
    "mongoimport.exe" --jsonArray --db databasename --collection collectioname --file %%~nf.json 
)