Mongodb обновить несколько документов с разными значениями - PullRequest
0 голосов
/ 14 января 2020

Я пытался использовать updatemany с пн goose. Я хочу обновить значения в базе данных, используя массив объектов.

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

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

Я хочу использовать в качестве фильтра вариантId. Схема модели:

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

Я хочу отфильтровать модели с помощью optionId, а затем уменьшить запасы.

Ответы [ 2 ]

2 голосов
/ 14 января 2020

Поскольку вам нужно обновить несколько документов по нескольким критериям, тогда .updateMany() не будет работать - это будет работать, только если вам нужно обновить несколько документов с одинаковым значением, попробуйте этот запрос ниже, который поможет вам сделать это в один вызов БД:

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)

Ссылка: MongoDB-bulkWrite

1 голос
/ 14 января 2020

Не думаю, что это можно сделать с помощью одного Model.updateMany запроса. Вам нужно будет l oop массив и использовать вместо него Model.update.

for (const { variantId, quantity } of objects) {
    Model.update({ _id: variantId }, { $inc: { stocks: -quantity } });
}

Чтобы выполнить это в транзакции (https://mongoosejs.com/docs/transactions.html), код должен выглядеть примерно так это (однако я не пробовал и не проверял это):

mongoose.startSession().then(async session => {
    session.startTransaction();

    for (const { variantId, quantity } of objects) {
        await Model.update({ _id: variantId }, { $inc: { stocks: -quantity } }, { session });
    }

    await session.commitTransaction();
});
...