mongoDB에서 .populate() 사용



제품 및 범주에 대한 두 개의 컬렉션이 있는 전자 상거래 웹 사이트의 일반적인 예를 들어 보겠습니다.

각 제품은 "신발", "모자", "바지"와 같은 특정 범주에 속하며 각 제품의 해당 컬렉션을 참조하려고 합니다.

카테고리 이름 변경이 복잡해지기 때문에 카테고리의 실제 이름을 제품 레코드에 포함하고 싶지 않습니다. "신발"카테고리에 속하는 수천 개의 신발이 있고 이름을 "신발"로 바꾸기로 결정했다고 가정해 보십시오. 그렇게 하려면 "신발"을 "신발"로 대체하도록 모든 제품을 업데이트해야 합니다.

대신 카테고리 컬렉션에서 "신발"레코드만 참조하는 경우에는 카테고리 컬렉션에서 하나의 레코드만 업데이트하고 이름을 "신발"에서 "신발"로 바꾸면 됩니다. 이 카테고리를 가리키는 모든 제품은 카테고리 ID가 변경되지 않으므로 업데이트할 필요가 없습니다.

그리고 category_id 필드의 제품에 대한 데이터를 가져오면 카테고리 컬렉션에서 카테고리 레코드의 ID를 갖게 됩니다. 그러나 대신 얻고자 하는 것은 이 범주의 실제 이름입니다. 이것은 .populate() 방법으로 쉽게 달성할 수 있습니다. 방법을 알아보겠습니다.

제품 스키마:

const mongoose = require("mongoose");

const productSchema = new mongoose.Schema({
  name: { type: String, required: true, unique: true },
  price: { type: Number, required: true },
  color: { type: String, required: true },
  description: { type: String, required: true },
  category_id: { type: mongoose.Types.ObjectId , required: true, unique: true, ref: 'categories' },
});

module.exports = mongoose.model("products", productSchema );

category_id에서 볼 수 있듯이 다른 컬렉션, 즉 "카테고리"에서 해당 카테고리의 ID가 있습니다.

범주 스키마:

const mongoose = require("mongoose");

const categorySchema = new mongoose.Schema({
  category: { type: String, required: true, unique: true },
});

module.exports = mongoose.model("categories", categorySchema);


여기에는 범주의 이름만 있습니다.

이제 할 수 있는 일은 DB에서 제품을 가져올 때 .populate() 있는 그대로 표시되는 대신 (문자와 숫자의 기본 mongoDB 임의 시퀀스) 해당 카테고리를 가져오고 싶다고 말하는 category_id 메서드를 추가하는 것입니다. 이름을 지정하고 대신 사용하십시오. 예를 들어 모든 제품을 찾으려고 합니다.

async findAll (req, res) {
    try {
        let product = await products.find({}).populate('category_id')
        res.send(product)
    }
    catch(e) {
        res.send({e})
    }
}


따라서 이제 모든 제품에는 id 참조 대신 카테고리 이름이 포함됩니다.

Postman에서 결과를 살펴보겠습니다. 첫째, .populate()가 없으면 이렇게 됩니다. 가져온 제품 데이터에서 범주의 ID만 볼 수 있음을 알 수 있습니다. 분명히 렌더링 목적으로 사용할 수 없습니다.


이제 동일한 요청이지만 .populate() . 이제 id 대신 바로 렌더링할 수 있는 범주의 실제 이름을 볼 수 있습니다.


🤷‍♀️

좋은 웹페이지 즐겨찾기