기억 휘발 방지소

[Node.js / mongoose] populate() 본문

Database/ODM

[Node.js / mongoose] populate()

choice91 2021. 9. 28. 22:58
728x90
반응형

populate를 사용하면 어떤 컬렉션에서 ObjectId를 이용해서 다른 컬렉션의 정보를 담아 출력할 수 있다.

 

📌 관계설정 (ref)

owner에는 몽고DB에서 자동으로 생성되는 _id가 저장된다. _id는 ObjectID이므로 type도 ObjectId로 설정해준다.

'type: ObjectId'라고 하면 안되고 아래 코드처럼 'type: mongoose.Schema.Types.ObjectId'라고 해야한다.

ref로 어떤 모델을 사용하려고 하는지 알려주면 된다.

// Post.js
import mongoose from "mongoose";

const postSchema = new mongoose.Schema({
  title: { type: String, required: true, trim: true },
  contents: { type: String, required: true, trim: true },
  createdAt: { type: Date, required: true, default: Date.now },
  meta: {
    views: { type: Number, default: 0, required: true },
    rating: { type: Number, default: 0, required: true },
  },
  owner: { type: mongoose.Schema.Types.ObjectId, required: true, ref: "User" },
});

posts는 어떤 사용자 본인이 작성한 글에 대한 _id를 배열의 형태로 저장한다.

// User.js
import mongoose from "mongoose";

const userSchema = new mongoose.Schema({
  email: { type: String, required: true, unique: true },
  username: { type: String, required: true, unique: true },
  password: { type: String },
});

 

📌 업로드

게시물을 작성할 때 제목, 내용은 req.body에서 받고 _id는 req.session에서 로그인 한 사용자의 _id 정보를 가져와서 DB에 넣어준다.

export const postUpload = async (req, res) => {
  const {
    user: { _id },
  } = req.session;
  const { title, contents } = req.body;
  await Video.create({
    title,
    contents,
    owner: _id,
  });
  // ...
};

 

📌 결과확인하기

아래 코드처럼 console.log(post)를 했을 때 어떤 결과가 나오는지 확안해보면

export const openPost = async (req, res) => {
  const { id } = req.params;
  const post = await Post.findById(id);
  console.log(post);
  // ...
};

owner에 게시물을 등록한 사용자의 _id가 잘 들어갔다.

{
  meta: { views: 0, rating: 0 },
  _id: new ObjectId("6152fc5189db83bf1fc6350f"),
  title: 'Greeting!!',
  contents: 'Hello~~~',
  owner: new ObjectId("6152fbd61a84d7543abf5af5"),
  createdAt: 2021-09-28T11:28:17.179Z,
  __v: 0
}

 

코드를 조금 바꿔서 populate로 다른 컬렉션(User)를 참조해보자

export const openPost = async (req, res) => {
  const { id } = req.params;
  const post = await Post.findById(id).populate("owner");
  console.log(post);
  // ...
};

똑같이 console.log(post)를 했을 때

User 컬렉션을 참조해서 _id에 해당하는 유저의 정보를 가져왔다.

{
  meta: { views: 0, rating: 0 },
  _id: new ObjectId("6152fc5189db83bf1fc6350f"),
  title: 'Greeting!!',
  description: 'Hello~~~',
  owner: {
    _id: new ObjectId("6152fbd61a84d7543abf5af5"),
    email: 'user123@gmail.com',
    username: 'user123',
    password: '$2b$05$zxfnbUHd4.BZea65WeDtH.onK6sQig/0HxWKLc57.blDC7GtlLf4S',
    __v: 0
  },
  createdAt: 2021-09-28T11:28:17.179Z,
  __v: 0
}

 

728x90
반응형