#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-го аргумента, не заключая его в другой объект.