flutter

mongoose subdocument

햎피 2022. 7. 21. 18:08
반응형

subdocument : 도큐먼트 안의 도큐먼트, 스키마 안의 스키마

 

예를들어서, 여행 앱을 만든다고 한다면, 유저가 있을 것이다.

유저는 여행을 5곳을 다녔다.

그러면 유저는 여행정보를 5개를 가지고 있다.

유저가 로그인 했을 때, 쉽게 해당 여행에 대한 기록을 볼 수 있기 위해서, User DB 안에 trip을 reference로 property로 만들어준다.

그러면 다음과 같은 형태일 것이다.

const user = new Schema(
  {
    username: { type: String, unique: true },
    email: { type: String, unique: true },
    password: { type: String, select: false },
    triplist:[{ 
      type:Schema.Types.ObjectId, 
      ref:'Trip'
     }]
  },
);

 

그런데, 이 앱에는 여행마다 색상을 지정해 줄 수 있다.

여행마다 색상을 정해주는 것이므로, user 스키마의 property인 triplist에 색상에 대한 정보를 함께 넣어준다면 간편할 것이다.

이럴때 사용하는 것이 subdocument이다.

const user = new Schema(
  {
    username: { type: String, unique: true },
    email: { type: String, unique: true },
    password: { type: String, select: false },
    triplist:[{ 
      trip : {type:Schema.Types.ObjectId, ref:'Trip'},
      allow : {type : Boolean},
      color : {type : String},
     }]
  },
);

그리고, 이렇게 subdocument를 만들었다면, subdocument에 데이터를 넣어주어야할 것이다.

데이터를 넣는 방법은 push를 사용해주면 된다.

아래 코드이다.

 user[0].triplist.push({
      trip: req.body.tripid,
      allow: req.body.allow,
      color: req.body.colorCode,
    });

 

그리고 데이터를 넣어준 후에 저장을 해줘야한다.

저장을 하지 않으면, 나중에 user를 불러왔을 때 변화가 없다.

save함수를 이용해서 저장해주면 된다.

user[0].save(function (err) {
      if (err) {
        res.status(404).json({ message: "error" });
      }
    })

 

이렇게 하고나면 DB에 triplist부분이 저장이 된 것을 확인 할 수 있다.

반응형