【问题标题】:mongoose update : $inc is not working in upsert猫鼬更新:$inc 在 upsert 中不起作用
【发布时间】:2015-11-18 19:07:01
【问题描述】:

我正在尝试更新文档(如果存在)或插入(如果不存在)。我有一个带有 $inc 的字段,(想要将先前的值加一)。 我的代码是

var Appuser = new Appusers({
   imei: req.body.imei,
   $inc : {user_count:1},
   install_flag : 1
});
var upsertData = Appuser.toObject();

delete upsertData._id;

Appusers.update({imei: Appuser.imei}, upsertData, {upsert: true}, function(err, data){ 
   if(err) return console.log(err);
   res.send(data);
});

只有 $inc 不起作用。在架构中我有user_count : { type:Number, default:0}

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    当值不存在时,你不能增加它(还)。您可以在插入文档时使用$setOnInsertuser_count 设置为1。这是$setOnInsert 的文档。

    您的查询将如下所示:

    var Appuser = new Appusers({
        imei: req.body.imei,
        install_flag : 1
    });
    
    Appusers
        .update({
            imei: Appuser.imei
        }, {
            $set: upsertData,
            $setOnInsert: {
                user_count: 1
            },
            $inc: {
                user_count:1
            }
        }, {
            upsert: true
        }, function(err, data) {
            if(err) return console.log(err);
            res.send(data);
        });
    

    【讨论】:

    • 此代码将在插入时设置 user_count=1,如果 $inc 不起作用,如何在更新时将值加一
    • @AmmarHayderKhan $inc 是否不适用于现有文档(使用您的代码)?
    • @AmmarHayderKhan 嗯。奇怪的。你能试试我更新的答案吗?
    • 为什么这被否决了?我的回答有什么问题?
    • 答案不正确,因为 Mongoose 不允许将 $setOnInsert 和 $inc 用于同一字段。您将收到以下错误:MongoError: Cannot update 'user_count' and 'user_count' at the same time。似乎不存在文档上的 $inc 会将增量值分配给该字段,因此在这种情况下无需使用 $setOnInsert。
    【解决方案2】:

    我想建议这个:

    Appusers.update({imei: Appuser.imei}, {$set: {imei: req.body.imei, install_flag : 1}, $inc : {user_count:1}}, {upsert: true}, function(err, data){ 
       if(err) return console.log(err);
       res.send(data);
    });
    

    或者如果你想使用一个对象:

    var upsertData = {
          $set: {imei: req.body.imei, install_flag : 1}, 
          $inc: {user_count: 1}
    };
    
    Appusers.update({imei: Appuser.imei}, upsertData, {upsert: true}, function(err, data){ 
       if(err) return console.log(err);
       res.send(data);
    });
    

    【讨论】:

    • noooooo 需要说对不起,我已经感谢你的回答了
    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2017-10-11
    • 1970-01-01
    相关资源
    最近更新 更多