Node.js Mongodb回调问题
如果tmx较新,如果旧的什么都不做,并且如果不存在,插入文档,我的应用应该更新。 如果插入文档,它可以很好地工作,否则它不会正确更新或者说E11000 dup键。 试图找出我的回调是错误还是逻辑。 (我是新的node.js + mongodb)MongoClient = require('mongodb')。MongoClient, assert = require('assert'), url ='mongodb:// localhost:27017/pfc';Node.js Mongodb回调问题
MongoClient.connect(url, function (err, db) {
run(db);
});
function run(db) {
fs.readFile('log.log', 'utf8', function (err, source) {
if (err) throw err;
var dataFile = JSON.parse(source);
dataFile.forEach(function (item) {
upsert(db, item, function (err, result) {
if (err) console.dir(err);
});
});
})
}
function upsert(db, doc, callback) {
db.collection('flags').findOne({vid: doc.vid}, function (err, item, result) {
if (item.vid != null) {
if (!(item.tmx instanceof Date)) {
item.tmx = new Date(item.tmx)
}
if(!(doc.tmx instanceof Date)){
doc.tmx = new Date(doc.tmx)
}
if (item.tmx < doc.tmx) {
console.dir("Date validation")
db.collection('flags').updateOne({vid: item.vid}, {
$set: {
"tmx": doc.tmx
}
},{upsert:true}, function (err, result) {
callback(err, result);
}
)
callback(err, result);
}
else{
console.dir("older")
callback(err, result);
}
}
else {
db.collection('flags').insertOne(doc, function(err, result) {
callback(err, result);
});
}
})}
编辑: 从 'log.log' 文件中的文件有这样的结构:
{ VID:2848 TMX: “2015-07-18T23:56:17.000Z” }
{ VID:2848 TMX:2015-07-19T00:00:17.000Z }
collection.find({VID:doc.vid},函数(例如RR,项目){
如果(项目)//没有发现在收集,项目与VID:2848 插入文档,以收集 否则,如果(项目)//发现VID项目:2848 如果(项目.tmx < doc.tmx)如果doc.tmx是新 更新集合与最近的文档
与@Aaron杜福尔帮助我摆脱回调的问题//只更新,谢谢:) 但现在的问题是当我已经收集已经收集的文档并在log.log中查找最新的文档时,它从最早的文档开始直到最新的文档:(
您的upsert
很容易受到竞争条件的影响,并且run
会多次并行调用,所以这可能是问题所在。目前尚不清楚doc
看起来到底是什么样,所以你可能需要稍微更复杂的逻辑,但这里是一个使用蒙戈的upsert
,以使事情更安全的版本:
function upsert(db, doc, callback) {
db.collection('flags').update({vid: doc.vid}, {$set: doc}, {upsert: true}, function(err) {
db.collection('flags').update({vid: doc.vid, tmx: {$lt: doc.tmx}}, {$set: tmx: doc.tmx}, function(err) {
callback();
});
});
}
m8你是一个天才,救了我的命:D –
发现了一个小错误, 例如,最早的记录是从07/08/2015 00:00:17和最新来自今天。 如果我再次运行该应用程序,它将更新为最旧,然后再次尝试新的方式,我尝试的方式不起作用。 :( 如何避免这种情况? –
@TelmoIvo我不明白你遇到的问题,也许编辑它到问题,所以你有更多的空间来解释它? –
你UPSERT逻辑是脆弱的竞争条件,这可能会导致问题。你尝试过Mongo的内置upsert吗? –
当我必须比较日期来更新 –
时,无法看到如何使用它,因为如果该项不存在,则获得item.tmx属性为null的错误,所以我需要确认该项存在,以便我可以比较文件中的日期与mongodb的日期 –