본문으로 바로가기
 

Mongoose v5.9.25: Query Population

Populate MongoDB has the join-like $lookup aggregation operator in versions >= 3.2. Mongoose has a more powerful alternative called populate(), which lets you reference documents in other collections. Population is the process of automatically replacing th

mongoosejs.com

 

 

관계가 설정된 속성에는 대개 해당 모델의 식별자인 Id를 넣습니다. (레퍼런스 방식의 연결)

 

const UserSchema = mongoose.Schema({
  name: String,
  email: String,
  avartarUrl: String,
  kakaoId: Number,
  githubId: Number,
  videos: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Video",
    },
  ],
});

 

그런데 이후 User를 호출해보면, videos 속성에는 videos id밖에 없습니다.

ObjectId를 실제 객체로 치환하는 작업을 위해서는 populate를 해야 합니다.

 

 

특정 이메일에 해당하는 User 도큐먼트를 하나 찾고, 해당 도큐먼트가 들고 있는 videos 속성에 해당하는 모든 videos 모델은 다음과 같이 불러올 수 있습니다.

User.findOne({email}).populate("videos").exec(function (err, video) {
    if (err) return handleError(err);
    console.log(video);}
);

 

 

populate는 인스턴스의 메서드가 아니라 모델의 메서드이기 때문에 아래와 같은 방식으로는 작동하지 않습니다.

Post.find(
  { section: section },
  null,
  { skip: (Page - 1) * 20, limit: 20 },
  function (err, post) {
    if (err) return res.json({ postFound: false, erro: err.message });
    
    // 인스턴스인 post에 populate를 하면 적용되지 않습니다.
    const populatedPost = post.populate("author");
    
    return res.json({ postFound: true, posts: populatedPost });
  }
);

 

여기서 exec 메서드가 참 유용하게 사용됩니다. 상위에서 populate를 한 후에 인스턴스를 활용하면 됩니다.

apiRouter.post("/post/request", (req, res) => {
  const { section, Page } = req.body;

  // find 후에 populate를 하고, exec의 콜백으로 populate된 인스턴스를 사용하면 됩니다.
  Post.find({ section: section }, null, { skip: (Page - 1) * 20, limit: 20 })
    .populate("author")
    .exec(function (err, post) {
      if (err) return res.json({ postFound: false, erro: err.message });
      return res.json({ postFound: true, posts: post });
    });
});

 

 

 


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체