관계가 설정된 속성에는 대개 해당 모델의 식별자인 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 });
});
});
'DB, ORM > 🍃mongoose, pymongo' 카테고리의 다른 글
mongoDB를 사용한 데이터의 Pagination 효율성 개선법 (3) | 2020.09.14 |
---|---|
text 인덱스를 활용한 mongoDB 검색 기능 구현 (0) | 2020.08.11 |
mongoose Schema option 이용하기 (0) | 2020.07.23 |
모델과의 관계 설정 (임베디드 방식/레퍼런스 방식) (0) | 2020.06.17 |
mongodb 기본 메서드 외 다른 살펴보기 (0) | 2020.06.10 |