2

mongodbにいくつかのマトリックスを挿入する必要があるため、次の簡単なコードを書きました

var MongoClient = require('mongodb').MongoClient;    
var matrisMaker = function(d1,d2){
    var result = new Array();
    for (var i = 0;i < d1;i++){
        result.push(new Array());
        for (var k = 0;k < d2;k++){
            result[i].push(Math.round(Math.random() * 1000000000000));
        }
    }
    return result;
};

  MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
    if(err) throw err;

    var collection = db.collection('matris');

    for (var counter = 0;counter < 10000000;counter++){
        var insertObject = {
                'matrisA':matrisMaker(20,20),
                'matrisB':matrisMaker(20,20),
                'resultA':new Object(),
                'resultB':new Object()
        };
        collection.insert(insertObject, function(err, docs) {
            if (err)
                throw err;
        });
        delete insertObject;
        if ((counter % 1000) == 0)
            console.log(counter);
    }
    db.close();
  })

ログを見ると、50,000 のように挿入されたレコードが多すぎることが出力されましたが、mongodb を使用してレコードの量をカウントすると、1,000 レコードに近い値が表示されます。

>use test;
>db.matris.count();

問題はどこだ?

4

1 に答える 1

3

非同期コードに欠陥があり、非同期コマンドがすべて完了db.close()する前に行が実行されます。insertプログラムのフローを制御して、A) 100 万件の同時データベース挿入が発生/キューに入れられないようにし、B) 接続を閉じる前にそれらがすべて mongo によって処理されるまで待機する必要があります。async.forEach自分でコーディングしたくない場合は、これを支援するようなヘルパー ライブラリを検討してください。

于 2013-07-14T08:10:54.920 に答える