모라고..? NoSQL에서 관계형연결이 가능해..?
??? : 네~ 가능합니다.
Mongoose를 이용해 MongoDB schema에 Relationship을 주는 방법을 알아 보았다.
DBrefs
속성을 사용을 통해 두 개의 Document간에 관계형성을 할 수 있다.예시로 사용될 구조는 아래와 같다.
각 userSchema.js
, shelterSchema.js
파일안에 schema가 정의 된다 했을때 reviewSchema.js
에서 user_id와 shelter_id에 ObjectId
를 이용하여 관계설정을 해줄 수 있다.
// userSchema.js
import mongoose, { Schema } from "mongoose";
const userSchema = new Schema({
// ...
}, {
timestamps: true,
});
const User = mongoose.model("User", userSchema);
export { User };
// shelterSchema.js
import mongoose, { Schema } from "mongoose";
const shelterSchema = new Schema({
// ...
}, {
timestamps: true,
});
const Shelter = mongoose.model("Shelter", shelterSchema);
export { Shelter };
reviewSchema.js
파일에서 user_id
와 shelter_id
를 User
와 Shelter
스키마와 연결해주기 위해 ref
속성을 사용해준다.// reviewSchema.js
import mongoose, { Schema } from "mongoose";
import { User } from "./userSchema"; // User 스키마 가져오기
import { Shelter } from "./shelterSchema"; // Shelter 스키마 가져오기
const reviewSchema = new Schema(
{
//...
user_id: {
type: Schema.Types.ObjectId,
ref: "User",
},
shelter_id: {
type: Schema.Types.ObjectId,
ref: "Shelter",
},
},
{
timestamps: true,
}
);
const Review = mongoose.model("Review", reviewSchema);
export { Review };
Review
스키마에서 정의한 관계를 활용하여 데이터를 조회하거나 조작하여 관계 설정이 되었는지 확인해보자.
// 특정 리뷰와 관련된 사용자 정보 가져오기
const review = await Review.findById(reviewId).populate("user_id");
// 쉼터와 관련된 리뷰 정보 가져오기
const shelter = await Shelter.findById(shelterId).populate("reviews");