Mongodb findOneAndUpdate function is inserting new document

Viewed 1068

I just need to update serviceActiveFlag status whenever i make an update api call.After an update api call,i can see a new document with empty vehicle array is created as shown below.

_id:59c76073c11d3929148f500f
vehicle:Array
_v:0

id field will override upon every put api call.

Can some one help me to resolve this issue?

schema

var localTransportSchema = new Schema({

        name: { type: String, required: false, trim: true },
        contact: {
            addressLine1: { type: String, required: false },        
            serviceActiveFlag: { type: String, required: false, enum: ['Y', 'N'] },
    }, 
    vehicle: [{
        vehicleType:{ type: String, required: false, enum: ['sedan', 'hatchback', 'suv', 'mpv', 'luxury'] },        
    }]
});
module.exports.accomodationModel = mongoose.model(collection, localTransportSchema);

controller

var updates = {
            $set: {
                "contact.addressLine1": req.body['addressLine1'],                
                "contact.serviceActiveFlag": req.body['serviceActiveFlag']
            }
    };

    transportModel.findOneAndUpdate({ "name": req.body['providerName']},
        updates, { returnOriginal: false, upsert: false }, function (err, doc) {
            if (err) {
                logger.error("Error while updating record : - " + err.message);
                return res.status(409).json({
                    "Message": "Error while updating transport details for provider " + req.body['providerName'] + " in transport details table"
                });
            } else if (doc === null) {
                logger.error("Error while updating record in transport details : - unable to update database");
                return res.status(409).json({
                    "Message": "Error while updating transport details for provider " + req.body['providerName'] + " due to " + err.message
                });
            }
        });
1 Answers

dbModel.findOneAndUpdate() of mongoose insert a new document only when your filter query(where claus) failed to find the existing document i.e there is no matching document exist in your collection. So mongoose will insert the new document to the collection. This works similar to upsert:true of update()

Ref :Official docs about findOneAndUpdate

Related