如果tmx是新的,我的应用程序应该更新,如果旧的什么都不做,如果不存在,请插入文档。
如果插入了文档,则可以正常工作,否则将无法正确更新或显示E11000 dup键。
试图弄清楚我的回调是错误的还是逻辑。 (我是node.js + mongodb的新手)MongoClient = require('mongodb')。MongoClient,
断言= require('assert'),
url ='mongodb:// localhost:27017 / pfc';
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},function(err,item){
if(!item)//在集合中未找到vid:2848的项目
将文档插入收藏夹
else if(item)//找到了一个vid为2848的物品
如果(item.tmx 使用最新文档更新收藏集
在@Aaron Dufour的帮助下,我摆脱了回调问题,谢谢:)
但是现在的问题是,当我已经填充了集合并在log.log中查找最新文档时,它从最早的文档开始直到再次出现最新的:(
最佳答案
您的upsert
容易受到竞争条件的影响,并且run
会多次并行调用它,因此可能是问题所在。目前尚不清楚doc
是什么样子,因此您可能需要稍微复杂一点的逻辑,但这是一个使用Mongo的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();
});
});
}
关于javascript - Node.js Mongodb回调问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31900116/