Mongodb插入没有成功完成(使用node.js)

我有一个加载XML文件的node.js脚本。 它循环遍历Mongo数组中的每个元素,并他们都正确地插入,但是当脚本完成了对db.collection.count();的检查时db.collection.count(); 告诉我已经插入数据库的logging比预期数less得多。

我怎样才能使mongo和node.js与插入很好地玩?

 GrabRss = function() { var http = require('http'); var sys = require('sys'); var xml2js = require('xml2js'); var fs = require('fs'); var Db = require('../lib/mongodb').Db, Conn = require('../lib/mongodb').Connection, Server = require('../lib/mongodb').Server, // BSON = require('../lib/mongodb').BSONPure; BSON = require('../lib/mongodb').BSONNative; var data; var checked = 0; var len = 0; GotResponse = function(res) { var ResponseBody = ""; res.on('data', DoChunk); res.on('end', EndResponse); function DoChunk(chunk){ ResponseBody += chunk; } function EndResponse() { //console.log(ResponseBody); var parser = new xml2js.Parser(); parser.addListener('end', GotRSSObject); parser.parseString(ResponseBody); } } GotError = function(e) { console.log("Got error: " + e.message); } GotRSSObject = function(r){ items = r.item; //console.log(sys.inspect(r)); var db = new Db('myrssdb', new Server('localhost', 27017, {}), {native_parser:false}); db.open(function(err, db){ db.collection('items', function(err, col) { len = movies.length; for (i in items) { SaveItem(items[i], col); } }); }); } SaveItem = function(m, c) { /* REPLACE FROM HERE IN ANSWER */ c.find({'id': m.id}, function(err, cursor){ cursor.nextObject(function(err, doc) { if (doc == null) { c.insert(m, function(err, docs) { docs.forEach(function(doc) { console.log('Saved: '+doc.id+' '+doc.keywords); }); }); } else { console.log('Skipped: '+m.id); } if (++checked >= len) { process.exit(0); } }); }); /* REPLACE TO HERE IN ANSWER */ } //http.get(options, GotResponse).on('error', GotError); var x2js = new xml2js.Parser(); fs.readFile('/home/ubuntu/myrss.rss', function(err, data) { x2js.parseString(data); }); x2js.addListener('end', GotRSSObject); } GrabRss(); 

根据要求,代码在上面。 这个文件是在本地读取的(尽pipe它是一个HTTP请求,但现在是一个25兆文件,大量的RSSlogging)

我刚运行了一个〜10Klogging的文件,脚本运行后mongoDB中的项目数大概是800个。

根据答案我replace了插入代码:

有:

 c.update({'id': m.id}, {$set: m}, {upsert: true, safe: true}, function(err){ if (err) console.warn(err.message); else console.log(m.keywords); if (++checked >= len) { console.log(len); //process.exit(0); process.exit(0); } }); 

默认情况下,MongoDB写入不检查错误。

您需要在插入的选项中设置safe:true ,如node-mongodb-native的文档中所述:

 var collection = new mongodb.Collection(client, 'test_collection'); collection.insert({hello: 'world'}, {safe:true}, function(err, objects) { if (err) console.warn(err.message); if (err && err.message.indexOf('E11000 ') !== -1) { // this _id was already inserted in the database } }); 

否则你的callback将不会被调用的错误,你的客户将不知道他们。

你可能也想看看upserts和updates,因为在一个循环中如果find并插入null是非常低效的。

相反,如果匹配的文档存在,upsert会更新,否则会插入一个新的。 关于如何在Node中做到这一点的解释是在驱动程序的文档中。