Search code examples
node.jsmongodbmongoosemongoose-schema

Mongodb update multiple documents with different values


I have been trying to use updatemany with mongoose. I want to update the values in database using an array of objects.

[
            {
                "variantId": "5e1760fbdfaf28038242d676",
                "quantity": 5

            },
            {
                    "variantId": "5e17e67b73a34d53160c7252",
                    "quantity": 13
            }
            ]

I want to use variantId as filter. Model schema is:

let variantSchema = new mongoose.Schema({
    variantName: String,
    stocks: {
        type: Number,
        min: 0
    },
    regularPrice: {
        type: Number,
        required: true
    },
    salePrice: {
        type: Number,
        required: true
    }
})

I want to filter the models using variantId and then decrease the stocks.


Solution

  • As you need to update multiple documents with multiple criteria then .updateMany() wouldn't work - it will work only if you need to update multiple documents with same value, Try this below query which will help you to get it done in one DB call :

    const Mongoose = require("mongoose");
    
    let variantSchema = new mongoose.Schema({
        variantName: String,
        stocks: {
            type: Number,
            min: 0
        },
        regularPrice: {
            type: Number,
            required: true
        },
        salePrice: {
            type: Number,
            required: true
        }
    })
    
    const Variant = mongoose.model('variant', variantSchema, 'variant');
    
    let input = [
        {
            "variantId": "5e1760fbdfaf28038242d676",
            "quantity": 5
    
        },
        {
            "variantId": "5e17e67b73a34d53160c7252",
            "quantity": 13
        }
    ]
    
    let bulkArr = [];
    
    for (const i of input) {
        bulkArr.push({
            updateOne: {
                "filter": { "_id": Mongoose.Types.ObjectId(i.variantId) },
                "update": { $inc: { "stocks": - i.quantity } }
            }
        })
    }
    
    Variant.bulkWrite(bulkArr)
    

    Ref : MongoDB-bulkWrite