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/

10-09 20:34