Можем ли мы обновить обычное поле и поле вложенного массива одновременно в MongoDB?

#javascript #node.js #mongodb #express #mongoose

#javascript #node.js #mongodb #экспресс #мангуст

Вопрос:

У меня есть схема продукта, например

  quantity: { type: Number, required: true },
    batch_no: {
        type: [

            {

                batch_no: { type: String, required: true },
                quantity: { type: Number, required: true },
                created_at: { type: Date, default: Date.now() },



            }

        ],
        default: []
    }

  

Я пытаюсь обновить оба поля количества в одном запросе.

Код выглядит примерно так :

 var expression = { $and: [{ "$inc": { "quantity": -10 } }, { "$inc": {"batch_no.$.batch_no": -10 } }] }

await ProductModel.findOneAndUpdate({ "sku": "TestSKU", "batch_no.$.batch_no":"Batch 1" }, { expression }, (err, response) => {
                if (response) {
                    console.log("Update success")

                } else if (err) {
                    res.status(400).send(err);
                }
            });

  

Этот вложенный запрос не работает.

Нет ли способа, которым я могу обновить оба количества одновременно?

Ответ №1:

является оператором запроса. Если вы просто хотели обновить несколько полей с помощью $inc, вы можете передать их в качестве аргумента объекта пар ключ-значение в $inc, например:

 var expression = { $inc: { "quantity": -10, "batch_no.$.batch_no": -10 } }

await ProductModel.findOneAndUpdate({ "sku": "TestSKU", "batch_no.$.batch_no": "Batch 1" }, expression, (err, response) => {
    if (response) {
        console.log("Update success")

    } else if (err) {
        res.status(400).send(err);
    }
});
  

Кроме того, вы можете просто передать expression его непосредственно в качестве 2-го аргумента, не заключая его в другой объект.