Mongoose: обновить объект в массиве (bulkwrite)

#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. у каждого размера есть свои запасы