const Product = model('products', ProductSchema);
class ProductModel {
constructor() {
this.productProjection = { __v: 0 };
this.categoryPopulateOption = {
createdAt: 0,
updatedAt: 0,
__v: 0,
};
}
const productModel = new ProductModel();
-> class를 이용해서 모델의 틀을 잡아주고 constructor로 초기값을 설정하여 불필요한 필드값을 정보를 불러올때 제외하여 클라이언트가 처리할 정보의양을 줄여 효율적인 데이터의 복잡성을 줄입니다.
async create(productInfo) {
const createdNewProduct = await Product.create(productInfo);
return createdNewProduct;
}
->1.Create(생성):create 메쏘드를 이용하여 상품정보가 등록 될 수 있도록 합니다.
async findByTitle(title) {
const product = await Product.findOne(
{ productName: title },
this.productProjection,
);
return product;
}
async findById(productId) {
const product = await Product.findOne(
{ _id: productId },
this.productProjection,
).populate('categoryId', this.categoryPopulateOption);
return product;
}
async findOneByCategoryId(categoryId) {
const product = await Product.findOne(
{ categoryId },
this.productProjection,
).populate('categoryId', this.categoryPopulateOption);
return product;
}
async findAllByCategoryId(categoryId) {
const products = await Product.find(
{ categoryId },
this.productProjection,
).populate('categoryId', this.categoryPopulateOption);
return products;
}
-> 2.Read :(findOne,find) 메쏘드를 사용하여 상품 정보를 조회할 수 있는 read기능을 생성 가능하도록 했습니다.
async update({ productId, update }) {
const filter = { _id: productId };
const option = { returnOriginal: false };
const updatedProduct = await Product.findOneAndUpdate(
filter,
update,
option,
);
return updatedProduct;
}
-> 3.Update :(findOneAndUpdate) 메쏘드를 사용하여 특정 상품을 찾아서 정보를 업데이트 할 수 있습니다.
async deleteById(productId) {
const result = await Product.deleteOne({ _id: productId });
return result;
}
-> 4. Delete:(deleteOne) 메쏘드를 사용하여 특정 상품을 찾아 삭제 기능이 가능합니다.
async findAll() {
const products = await Product.find(
{},
this.productProjection,
).populate('categoryId', this.categoryPopulateOption);
return products;
}
async findAllBykeyword(keyword) {
const products = await Product.find(
{
$or: [
{ productName: { $regex: keyword, $options: 'i' } },
{
shortDescription: { $regex: keyword, $options: 'i' },
},
],
},
this.productProjection,
).populate('categoryId', this.categoryPopulateOption);
return products;
}
async insertMany(productsArray) {
const createdNewProducts = await Product.insertMany(productsArray);
return createdNewProducts;
}
-> 추가적으로 populate를 사용하여 , 카테고리 id 를 참조하여 해당 카테고리에 속한 상품들을 조회 할 수 있는 기능을 생성하였고, MongoDB의 $or 연산자는 productName 또는 shortDescription 필드 중 하나라도 주어진 조건(키워드와 일치하는 경우)에 부합하는 제품을 찾고,
이후에 populate 메소드를 사용하여 이러한 제품에 연관된 카테고리 정보를 추가한후 ,최종적으로 반환되는 제품 정보에 포함시켜 검색결과를 반환하도록 코드를 작성하였습니다.
아아앙