【问题标题】:double upsert in Node.js and mongoose在 Node.js 和 mongoose 中进行双重插入
【发布时间】:2013-12-24 15:17:31
【问题描述】:
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 文档,该文档计算总访问量并持有访问用户信息。 到目前为止一切顺利。它工作正常。

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

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

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

    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

    【讨论】:

      猜你喜欢
      • 2012-02-07
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      相关资源
      最近更新 更多