猫鼬更新:$ inc在upsert中不起作用

Amm*_*han 6 mongoose mongodb node.js express

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

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);
});
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*ans 8

尚不存在时,您无法增加值。您可以在插入文档时将user_count$setOnInsert设置为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);
    });
Run Code Online (Sandbox Code Playgroud)

  • 为什么这被否决?我的答案有什么问题? (2认同)

mic*_*lem 5

我想建议这个:

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);
});
Run Code Online (Sandbox Code Playgroud)

或者如果要使用对象:

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);
});
Run Code Online (Sandbox Code Playgroud)