Population는 문서의 경로를 다른 컬렉션의 실제 문서로 자동으로 바꾸는 방법입니다. 예를들어 문서 사용자 ID를 해당 사용자의 데이터로 바꿉니다. Mongoose는 우리를 도울 수있는 Population을 가지고 있습니다. 우리는 우리의 스키마에 ref를 정의하고 mongoose는 해당 ref를 사용하여 다른 컬렉션의 문서를 찾습니다.
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const UserSchema = new Schema({
name: String,
email: String,
blogs: [{
type: mongoose.Schema.Types.ObjectId,
ref: "Blog"
}]
});
const BlogSchema = new Schema({
title: String,
user: {
type: mongoose.Schema.Types.ObjectId,
ref: "User"
},
body: String,
comments: [{
type: mongoose.Schema.Types.ObjectId,
ref: "Comment"
}]
})
const CommentSchema = new Schema({
user: {
type: mongoose.Schema.Types.ObjectId,
ref: "User"
},
blog: {
type: mongoose.Schema.Types.ObjectId,
ref: "Blog"
},
body: String
})
const User = mongoose.model("Author", UserSchema);
const Blog = mongoose.model("Blog", BlogSchema);
const Comment = mongoose.model("Comment", CommentSchema);
module.exports = {User, Blog, Comment}
Populate 작동 ?
const User = require("path/to/userSchema");
User
.findOne({_id: userId })
.populate("blogs") // key to populate
.then(user => {
res.json(user);
});
/*
OUTPUT:
{
_id: userid, // obviously it will be id generated by mongo
name: "john doe",
email: "[email protected]",
blogs: [
{
_id: blogid,
title: "how to do nothing",
body: "Interesting matter in 11111the blog...",
comments: [commentId_1, commentId_2]
}
]
}
*/
populating 동안 특정 필드를 선택하려는 경우 select 키를 사용하여 개체 내부의 필드를 지정할 수 있습니다.
// simple populate
User
.findOne({_id: userId })
.populate("blogs", { name: 1 }) // get name only
// nested populate
User
.findOne({_id: userId})
.populate({
path: "blogs",
populate: {
path: "comments",
select: { body: 1 } // 1
}
})