当mongodb插入时,节点应用程序不工作
我还在学习mongodb和node.js。
我试图插入大量的数据说80k + 100k行。 我为此创build了一个使用express.js的应用程序。 我编码的方式,一旦上传button被点击后页面redirect到另一个页面,在后台应用程序插入数据到数据库。
问题是一旦插入开始应用程序停止响应。 即使在插入应用程序完成后,将会更慢2-3分钟。
我试过这个代码
1
- Fedora 14
- Intel P4 2.80GHz
- 1.5GiB
2
- Fedora 14
- i3 3.20GHz
- 3GiB
如何避免这个问题? 它会在更好的系统上运行得更好吗?
代码来存储数据
MongoClient.connect(MONGODB_URI, function (err, database) { var collection = database.collection(collectionName); for (index = 0; index < jsonResult.length; ++index) { var obj = jsonResult[index]; for (var prop in obj) { if (headers[prop] == 'Date') { obj[prop] = new Date(obj[prop].replace(/(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3")); } else if (headers[prop] == 'Integer') { obj[prop] = parseInt(obj[prop]); } else if (headers[prop] == 'Float') { obj[prop] = parseFloat(obj[prop]); } } collection.insert(obj, function (err, result) { if (err) { console.log(JSON.stringify(err)); } }); } });
注意:
- jsonResult是读取文件(csv)并将其转换成json的结果
-
标题是具有键 – 数据types映射的对象
var headers = {'iodate':'date','sno':'integer','salary':'float'}
代码来读取和转换CSV到JSON
var cv_json = require('convert-json'); // required module convert-json (convert-csv,xls,xlsx into json) cv_json({ input: target_path, output: null }, function (err, result) { if (err) { console.error(err); } else { persists(req, res, result, collectionName, headers); //Function where insert takes place. } })
现在,即使插入尚未完成,“persists()”仍会以亚氨酸forms返回。 这是由于javascript / nodejs的asynchronous性质。
您需要序列化插入操作,以免堵塞服务器。 使用async.eachSeries()
你的“persists”函数应该使用callback来通知调用者它已经完成。 喜欢这样的:
persists(req, res, result, collectionName, headers, callback){ MongoClient.connect(MONGODB_URI, function (err, database) { var collection = database.collection(collectionName); async.eachSeries(jsonResult, function(obj, cb){ for (var prop in obj) { if (headers[prop] == 'Date') { obj[prop] = new Date(obj[prop].replace(/(\d{2})-(\d{2})-(\d{4})/,"$2/$1/$3")); } else if (headers[prop] == 'Integer') { obj[prop] = parseInt(obj[prop]); } else if (headers[prop] == 'Float') { obj[prop] = parseFloat(obj[prop]); } } collection.insert(obj, function (err, result) { cb(err); }); }, function(err){ callback(); } ); }); }
然后使用它
persists(req, res, result, collectionName, headers, function(){ console.log("insert finished"); });