Дубликаты документов добавляются вместо увеличения количества - PullRequest
0 голосов
/ 11 июля 2020

Я создал такие модели, как

  1. Product.
  2. Корзина содержит массив ProductIds и их количество.
  3. Модель пользователя содержит CartId.
const cartSchema = new Schema({
    user_id : {
        type: Schema.Types.ObjectId,
        required: true
    },
    products: {
        items: [{product_id : {
            type: Schema.Types.ObjectId,
            requied: true,
            ref: 'Product',
            default: []
        }, qnty: {
            type: Number,
            requied: true,
            default: 0`enter code here`
        }}]

    }
});

const userSchema = new Schema({
  name: {
    type: String,
    required: true,
  },
  cart: {
    type: Schema.Types.ObjectId,
    ref: "Cart",
    default: null,
  },
});

Я собираюсь добавить информацию о продукте в документ корзины, который хранится в модели пользователя. Я написал определенные пользователем методы в классе модели, как показано ниже, но это не удается.

Метод addProductToCart в пользовательской модели

userSchema.methods.addProductToCart = function(product){

  console.log('User::addProductToCart this.cart', this.cart);
  if(this.cart === null) {
    this.cart = new Cart ({user_id: this._id, products: {items: [], quantity: 0}});
  }

  console.log('User2::addProductToCart this.cart', this.cart);
  //this.cart.save();
  return this.cart.addProductToCart(product);
};

Метод addProductToCart в корзине

cartSchema.methods.addProductToCart = function (rcvproduct) {
    console.log('Cart1::addProductToCart rcvproduct:', rcvproduct);

//Issue point
        const productIndex = this.products.items.findIndex(productObj =>{
        return productObj.product_id.toString() === rcvproduct._id.toString();
    });

    console.log('Cart2::addProductToCart productIndex:', productIndex);
    let newQuantity = 1;
    const updatedItems = [...this.products.items];

    if (productIndex >= 0) {
        newQuantity = this.products.items[productIndex].quantity + 1;
        updatedItems[cartProductIndex].quantity = newQuantity;
    } else {
        updatedItems.push({ 
            product_id: rcvproduct._id,
            quantity: newQuantity
        });

    }

    console.log('Cart3::addProductToCart updatedItems:', updatedItems);
    const updatedProducts = {
        items: updatedItems
    };
    console.log('Cart4::addProductToCart updatedProducts:', updatedProducts);
  
    this.products = updatedProducts;
    return this.save();
    console.log('Cart5::addProductToCart this.products:', this.products);
    console.log('Cart6::addProductToCart this:', this);
  };

O / P:

Добавить продукт в первый раз:

POST /addproducttocart
Valid Token
/addproducttocart
rcvProduct_id:  *5f06861a4555e524bc6fd687*
User::addProductToCart this.cart null
User2::addProductToCart this.cart {
  products: { default: [], items: [] },
  _id: 5f0977f60b913d2990c953fe,
  user_id: 5f0945c015841d0ebceb91de
}
Cart1::addProductToCart rcvproduct: [
  {
    discount: 0,
    available_stock: 0,
    _id: *5f06861a4555e524bc6fd687*,
    category_id: 5f067b6fdc2bb538d4522903,
    subcategory_id: 5f0683ea4555e524bc6fd673,
    name: 'productA',
    product_type: 0,
    weight: 1000,
    price: 46,
    description: 'Rich in fat contents &  also increases immunity',
    __v: 0
  }
]
Cart2::addProductToCart productIndex: -1

Добавить тот же продукт во второй раз:

POST /addproducttocart
Valid Token
/addproducttocart
rcvProduct_id:  *5f06861a4555e524bc6fd687*
User::addProductToCart this.cart null
User2::addProductToCart this.cart {
  products: { default: [], items: [] },
  _id: 5f0977f60b913d2990c953fe,
  user_id: 5f0945c015841d0ebceb91de
}
Cart1::addProductToCart rcvproduct: [
  {
    discount: 0,
    available_stock: 0,
    _id: *5f06861a4555e524bc6fd687*,
    category_id: 5f067b6fdc2bb538d4522903,
    subcategory_id: 5f0683ea4555e524bc6fd673,
    name: 'productA',
    product_type: 0,
    weight: 1000,
    price: 46,
    description: 'Rich in fat contents &  also increases immunity',
    __v: 0
  }
]
Cart2::addProductToCart productIndex: -1

Я новичок в mon goose ODM. Может ли кто-нибудь помочь мне определить существующий product_id в массиве Cart.products.items.

...