2
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 文档,该文档计算总访问量并持有访问用户信息。到目前为止一切都很好它工作正常。

现在我想在访问者数组中添加“计数器:编号”,当事件发生时,如果用户已经在访问者数组中,我想更新它而不是推送新的。但我不知道如何制作“双重插入”命令。有没有办法做到这一点?

4

1 回答 1

0

即使不可能执行满足您条件的查询,也可能有点困难。我已经通过以下查询重现了您的场景

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

于 2013-12-24T07:17:31.360 回答