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文档,该文档正在计算总访问量并保留访问用户信息。
到目前为止一切正常,它工作正常。
现在我想在访问者数组中添加“ counter:Number”,当事件发生时,如果用户已经在访问者数组中,我想更新它而不是推送新的。
但是我不知道如何发出“双重插入”命令。
反正有这样做吗?
最佳答案
进行满足您条件的查询可能有些困难甚至不可能。我通过以下查询重现了您的方案
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 的双重upsert,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19883881/