2

スキーマを変更せずに、テーブルを mysql から mongodb に直接インポートしようとしています。

私はそのための小さなノードスクリプトを書きましたが、私の問題はそれを実装する方法にあります。

ループ内で使用しているときに、mongo db insert limit を使用するという制限に達したのかもしれません。逆だったらこの問題は来なかったと思います(多分ない!)

これが問題です。mysql テーブルの行は 100,000 を超えていますが、ループ ヒットが約 30000 を超えると、挿入されるアイテムの数が減ります。

したがって、以下のスクリプトを使用して完全にインポートした後、mysql テーブルに 100,000 のアイテムがあったとします。最大で 37000 程度しか取得できません。

私の強い疑いは、ノード スクリプト/ノード mongodb コネクタ、またはスクリプトのバグ、または最後に mongodb 同時 db 挿入の制限のいずれかです。

以下にスクリプトを貼り付けます。私がそれを回避することを願っています。

ありがとう、

var http = require('http'),
  mysql = require('mysql'),
  mongo = require('mongodb').MongoClient,
  format = require('util').format;
var connection = mysql.createConnection({
  user: "xxx",
  password: "xxx",
  database: "mydb" 
});

connection.connect();
var query = "select * from mytable";
var mysqlrows = '';
connection.query(query, function(err,rows,fields){
  if(err) throw err;

  console.log(rows.length+'rows found.');

  mongo.connect('mongodb://root:root@127.0.0.1:27017/mydb', function(err, db){ 
    if (err)
      throw err;

    var collection = db.collection('mytable');
    for(var i=0; i<rows.length;i++)
    {
       //console.log(JSON.stringify(rows[i]));

      (function(i){
        collection.insert(rows[i],function(err,docs){});
        console.log(i);
      })(i);
    }

    db.close();        
  });    
});
connection.end();
4

2 に答える 2

2

insert問題は、呼び出しを介して MongoDb への接続を閉じる前に、操作が完了するのを待っていないことですdb.close();。未処理の非同期リクエストを追跡し、db.close();それらがすべて完了したときにのみ呼び出す必要があります。

于 2013-07-02T20:48:38.123 に答える
0

mySQL からすべてのデータを取得していることを確認するには、最後の行にアクセスしてみてください。取得できる場合は、mongodb のフラグ w および j を使用して、次の呼び出しに移動する前に各呼び出しでデータが挿入されるようにします。w および j フラグを使用すると、and 配列を使用して各呼び出しで複数の行を挿入することにより、複数の挿入を考慮する必要があります。

于 2013-07-02T16:24:24.490 に答える