在Node.js和mongoose中双重插入

var urlSchema = new Schema ( { url : String, visitor : [{name: String,date: Date}], counter : Number }); var url = mongoose.model('url',urlSchema); var domain = blah blah; var conditions = { url: domain }; var update = { $inc : {counter:1}, $push : { visitor: [{ name: data.username, date: new Date() }] } }; var options = {upsert: true}; url.update(conditions,update,options,function(err){ if(err){ console.log(err); }else{ console.log('A domain successfully added to DB'); } 

目前我正在使用上面的模式和代码来为每个页面创build一个访问计数器。 它将插入正在计算总访问和持有访问用户信息的url文件。 到目前为止这么好它工作正常。

现在我想在visitor数组中添加“counter:Number”,当事件发生的时候,如果用户已经在访问者数组中,我想更新,而不是推新的。 但是我不知道如何做'双重upsert'命令。 反正有这样做吗?

甚至不可能执行满足您的条件的查询可能有点困难。 我已经通过以下查询复制了您的场景

 url.findOne({'url': 'search.php', 'visitor.name': "JohnDoe"}, function (err, visitor) { if (visitor) { url.update( { 'url': 'search.php', 'visitor.name': "JohnDoe" }, { $inc: {'visitor.$.counter': 1, 'counter': 1} }, function(err, result) { if (err) { console.log("Error occured") } else { console.log("Success"); } }); } else { var conditions = { url: 'search.php' }; var update = { $inc : {counter:1}, $push : { visitor: [{ name: data.username, date: new Date(), counter: 0 }] } }; var options = {upsert: true}; url.update(conditions,update,options,function(err){ if(err){ console.log(err); }else{ console.log('A domain successfully added to DB'); } }); } } ); 

简单,插入如果不存在与计数器= 0,更新如果与递增计数器存在1