Ammar Hayder Khan
Ammar Hayder Khan

Reputation: 1335

mongoose update : $inc is not working in upsert

I am trying to update the document if exist or insert if not exist.I have one field with $inc,( want to increment previous value by one). My code is

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);
});

Only $inc is not working. In schema i have user_count : { type:Number, default:0}

Upvotes: 7

Views: 8554

Answers (2)

Thomas Bormans
Thomas Bormans

Reputation: 5354

You can not increase a value when it does not exists (yet). You can use $setOnInsert to set user_count to 1 when inserting the document. Here are the docs for $setOnInsert.

Your query will look like this:

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);
    });

Upvotes: 9

michelem
michelem

Reputation: 14590

I'd like to suggest this:

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);
});

Or If you want to use an object:

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);
});

Upvotes: 8

Related Questions