如果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邏輯是脆弱的競爭條件,這可能會導致問題。你嘗試過Mongo的內置upsert嗎? –
當我必須比較日期來更新 –
時,無法看到如何使用它,因爲如果該項不存在,則獲得item.tmx屬性爲null的錯誤,所以我需要確認該項存在,以便我可以比較文件中的日期與mongodb的日期 –