[Node] MongoDB + mongoose 관계설정하기

Chaeyoung·2023년 8월 22일
0

Mongoose Logo
모라고..? NoSQL에서 관계형연결이 가능해..?
??? : 네~ 가능합니다.

Mongoose를 이용해 MongoDB schema에 Relationship을 주는 방법을 알아 보았다.

MongoDB + Mongoose에서

  • MongoDB는 NoSQL 데이터베이스, Mongoose는 MongoDB를 더 편리하게 사용할 수 있게 해주는 ODM(Object Data Modeling) 라이브러리다.
  • MongoDB 홈페이지를 확인하면 Documents References에 대한 설명을 확인할 수 있다.
  • 몽고디비 홈페이지를 확인하면 ObjectId를 이용해 연결할 수 있다고 되어있다.

어떻게 연결하는데?

연결 설명 MongoDB 홈페이지

MongoDB 데이터 모델링에서 관계 설정하기

  • MongoDB에서 관계를 설정하려면 수동 참조와 DBrefs 속성을 사용을 통해 두 개의 Document간에 관계형성을 할 수 있다.
  • 수동참조하는 방법은 모르겠고 DBrefs로 관계설정하는 방법에 대해 알아보자.

1. 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 };

2. Review 스키마에서 관계 설정하기

  • reviewSchema.js 파일에서 user_idshelter_idUserShelter 스키마와 연결해주기 위해 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 };

3. 관계 활용하기

Review 스키마에서 정의한 관계를 활용하여 데이터를 조회하거나 조작하여 관계 설정이 되었는지 확인해보자.

  • 특정 리뷰의 작성자 정보를 가져오거나 쉼터 정보 조회가 가능하다.
// 특정 리뷰와 관련된 사용자 정보 가져오기
const review = await Review.findById(reviewId).populate("user_id");

// 쉼터와 관련된 리뷰 정보 가져오기
const shelter = await Shelter.findById(shelterId).populate("reviews");

  • 클라이언트 쪽에도 연결해둔 ObjectId가 찍히는 것을 확인할 수 있다.

0개의 댓글