gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:23:46 26 4
gpt4 key购买 nike

我有一个加载 XML 文件的 node.js 脚本。它遍历 Mongo 数组中的每个元素并它们都被正确插入,但是当脚本完成检查 db.collection.count(); 告诉我插入到数据库中的记录比预期的要少得多。

如何让 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();

根据要求,代码如上。本地读取文件(虽然以前是HTTP请求,但现在是25兆的文件,很多RSS记录)

我刚刚运行了包含约 10k 条记录的文件,脚本运行后 mongoDB 中的项目数约为 800 项。

根据答案,我替换了插入代码:

与:

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
}
});

否则您的回调将不会因错误而被调用,您的客户也不会知道这些错误。

您可能还想查看更新插入和更新,因为在循环中查找和插入 if null 的效率极低。

相反,如果匹配文档存在,upsert 将更新,否则将插入一个新文档。有关如何在 Node 中执行此操作的说明,请参见驱动程序的文档。

关于Mongodb 插入未成功完成(使用 node.js),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6085675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com