250x250
Notice
Recent Posts
Recent Comments
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- findByIdAndDelete
- jsonwebtoken
- Express
- RDS
- nginx
- https
- Nodejs
- EC2
- sequelize
- JavaScript
- AWS
- flutter
- single quote
- clipBehavior
- til
- await
- atlas
- moment
- async
- mongoose
- css
- Node.js
- TailwindCSS
- wil
- certbot
- mongodb
- TypeScript
- Find
- MYSQL
- double quote
Link
Archives
기억 휘발 방지소
[Node.js / mongoose] populate() 본문
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
반응형
'Database > ODM' 카테고리의 다른 글
[Node.js / mongoose] skip(), limit()로 페이지네이션 구현하기 (0) | 2021.10.15 |
---|---|
[Node.js / Mongoose] 데이터 삭제하기 (0) | 2021.10.04 |
[Node.js / mongoose] findByIdAndDelete로 삭제 (0) | 2021.09.21 |
[Node.js / mongoose] findByIdAndUpdate로 수정을 해보자 (0) | 2021.09.21 |
[Node.js / mongoose] findOne, findById로 검색을 해보자 (0) | 2021.09.20 |