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');
}
目前我正在使用上面的模式和代码为每个页面创建一个访问计数器。 它会更新 url 文档,这些文档正在计算总访问量并保存访问用户信息。 到目前为止一切正常。
现在我想在访问者数组中添加“计数器:数字”,当事件发生时,如果用户已经在访问者数组中,我想更新它而不是推送新的。 但我不知道如何制作“双重更新”命令。 有什么办法吗?
最佳答案
执行满足您条件的查询可能有点困难甚至不可能。我已经通过以下查询重现了您的场景
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
关于javascript - 在 Node.js 和 mongoose 中双重插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19883881/