#node.js #mongodb #mongoose
#node.js #mongodb #мангуст
Вопрос:
я пытаюсь обновить объект в массиве.
Раньше мое поле не было массивом, я использовал этот код для обновления своего поля :
exports.updateStock = (req, res, next) => {
console.log(req.body.order.products);
let myOperations = req.body.order.products.map((prod) => {
return {
updateOne: {
filter: { _id: prod._id },
update: { $inc: { stock: -prod.quantity, sold: prod.quantity } },
},
};
});
Product.bulkWrite(myOperations, {}, (err, products) => {
if (err) {
console.log("im here", err);
return res.status(400).json({
error: "Bulk operation failed",
});
}
next();
});
};
поле :
stock: [
{
size: {
type: String,
required: true,
},
stock: {
type: Number,
required: true,
},
},
],
есть идеи, как я могу обновить свой stock.stock в зависимости от размера?
размер передается с помощью product -> prod.size
Пример :
in store i have size : M | 100 stocks
L | 150 stocks
XS| 10 stocks
user : want to buy size M and quantity 2
so after the order i have to update Size m stocks
100-2 = 98 stocks remaing after order :
M | 98 stocks
L | 150 stocks
XS| 10 stocks
Вся моя схема продукта :
const mongoose = require("mongoose");
const { ObjectId } = mongoose.Schema;
const productSchema = new mongoose.Schema(
{
name: {
type: String,
trim: true,
required: true,
maxlength: 32,
},
description: {
type: String,
trim: true,
required: true,
maxlength: 2000,
},
discountprice: {
type: Number,
maxlength: 32,
trim: true,
},
price: {
type: Number,
required: true,
maxlength: 32,
trim: true,
},
category: [
{
type: ObjectId,
ref: "Category",
required: true,
},
],
subcategory: [
{
type: ObjectId,
ref: "SubCategory",
required: true,
},
],
stock: [
{
size: {
type: String,
required: true,
},
stock: {
type: Number,
required: true,
},
},
],
sold: {
type: Number,
default: 0,
},
photo: [String],
},
{ timestamps: true }
);
module.exports = mongoose.model("Product", productSchema);
Ответ №1:
Вы можете использовать фильтры массива для обновления stock
на основе size
в массиве stock
,
updateOne: {
filter: { _id: prod._id },
update: { $inc: { "stock.$[elem].stock": -prod.quantity, sold: prod.quantity } },
arrayFilters: [{ "elem.size": prod.size }]
}
Комментарии:
1. Спасибо за ваш ответ, я немного запутался, как он, например, узнает, что я хочу обновить запасы размера M?
2. Я также смущен вашим заявлением есть идеи, как я могу обновить свой stock.stock? вы хотели обновить свойство stock внутри stock, верно? в вашем запросе на обновление есть поле,
sold
которое я не вижу в вашей структуре полей. итак, вы можете очистить вещи.3. я немного запутался, можете ли вы привести один пример, когда запас равен 100, а размер равен M, и что и как вы хотите его обновить? вы хотите обновить только запас размера M?
4. допустим, вы хотите купить футболку. выбирается размер M и количество 2 … теперь я должен обновить запасы размера M… итак, 100-2 = 98 оставшихся запасов.
5. у каждого размера есть свои запасы