Вкладений масив об’єктів у Mongoose

Створення схеми

Коли у вас є вкладений масив, потрібно визначити окрему схему і використовувати її через властивість type
- джерело
- приклад:

import mongoose from 'mongoose'  

const DetailProductSchema = new mongoose.Schema({  
 seller_id: {  
 type: String,  
 required: true  
 },  
 title: {  
 type: String,  
 required: true  
 },  
 price: {  
 type: Number,  
 required: true  
 },  
 stock: {  
 type: Number,  
 required: true  
 },  
 quantity: {  
 type: Number,  
 required: true  
 }  
})  
const CartSchema = new mongoose.Schema({  
 cartId: {  
 type: String,  
 required: true  
 },  
 detailProducts: {  
 type: [DetailProductSchema],  
 required: true,  
 },  
},{  
 timestamps: true  
})  
const CartProduct = mongoose.model('Cart', CartSchema)  
export default CartProduct

В цьому прикладі ми маємо схему CartSchema з масивом об'єктів, який називається DetailProductSchema. Ми передаємо цю схему через властивість type і на завершення експортуємо модель.

Зміна об'єкта в масиві

Тепер, щоб оновити існуючий продукт, потрібно використовувати метод save, а не інші методи, такі як findAndUpdate. (джерело).

Для оновлення масиву потрібно використовувати стандартний синтаксис, тому давайте використовувати методи масивів і потім .save()

Приклад:

import CartProduct from "../models/cart.models.js"  

class CartProductRepository {  
 static async createProductCart(product, quantity, cartId) {  
 let cartSession = await CartProduct.findOne({ cartId })  

 console.log("Сесія існує, оновлюємо кошик")  

 const existingProductIndex = cartSession.detailProducts.findIndex(  
 (item) => item.seller_id === product.seller_id  
 )  
 let productInstance = cartSession.detailProducts.at(existingProductIndex)  

 console.log("Ми знайшли цей продукт: ", productInstance)   

 if (existingProductIndex === -1) {  
 console.log("Продукт не існує")  
 } else {  
 console.log("Оновлюємо продукт...")  
 productInstance.quantity += quantity  
 cartSession.detailProducts.splice(existingProductIndex, 1, productInstance )  
 return cartSession.save()  
 }  
}




Перекладено з: [Nested array of objects in mongoose](https://medium.com/@virtualnautilus/nested-array-of-object-in-mongoose-67902f4b90d2)

Leave a Reply

Your email address will not be published. Required fields are marked *