javascript - 在 Node.js 和 mongoose 中双重插入

标签 javascript node.js mongodb mongoose

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/

相关文章:

node.js - Mongoose 没有保存我的 POST 请求的所有字段

node.js - 在 Mocha 测试中,一半的时间都不会创建 Mongoose 索引

mongodb - 如何从 Heroku 中的 MongoHQ 下载生产数据到本地机器?

mongodb - 在 meteor 生产服务器中恢复一个 mongodb

javascript - 验证 IPv4、IPv6 和主机名

php - 如何通过 PHP 或 Javascript 检查 HTML 代码是否有效

javascript - 尝试使用 Three.js 重置整个场景时性能下降

node.js - 带列表的 Redis 发布/订阅

Javascript 类调用 Super 并在回调中使用它

ios - Parse.com 到 Heroku : use background job with heroku and scheduler