mongoDB 기존 Document 필드 추가

0
post-thumbnail

서론이 길 것 방법만 원한다면 쭉 내려가세요

MongoDB one to many로 정보들을 연결짓는 방법을 공부했고 강의를 보며 만들어보았다. 이미 서버를 만들어 놓았던 곳에 one to many를 사용했기 때문에 새로 추가해주는 데이터는 바로바로 연결되었지만

원래 db에 저장되어 있던 데이터들은 따로 추가해줘야 했다.

우선 이 파일에 대해 설명하면 특정 위인이 있고 위인을 만들면 해당 위인이 속한 국가의 대륙에 그 위인이 추가되는 파일이다.


위 사진을 참고하여 설명하자면 현재 Europe의 Who만 아이디가 추가되어 있는데 이 아이디들은 one to many 방식의 스키마를 설정한 이후에

const continentSchema = new Schema ({
    name: {
        type: String,
        required: [true, 'Continent must have name']
    },
    area: Number,
    weather: {
        type: String,
        required:[true, 'weather required']
    },
    
    picture: String,


// who를 추가해주었음

    Who: [ 
        {
            type: Schema.Types.ObjectId,
            ref: 'People'
        }
    ],
})

새로만든 위인들의 아이디가 추가 된 상황이고 아래 대륙들의 Who에는 아이디가 없다.

이 대륙들에 해당하는 인물들은 존재하지만 이미 만들어 놓은 데이터이기 때문에 그 인물들의 데이터에 대륙을 추가해주는 과정을 갖지 않았기 때문이다.


존재하는 인물들이고 위 스키마에서 Who를 만들어주고 continent 통해서 인물데이터 추가해주는 라우터 설정 다 해주고 인물을 하나만 추가했고 그 인물은


니체다. 이 인물 디테일 페이지를 보면 이름 등의 정보들이 나열 되어있고 continent: Euopre이 명시되어 있음을 볼 수 있다.
(이미 존재하고 있던 다른 인물 데이터들은 저 대륙 정보가 없어 해당 인물을 클릭하면 오류가 뜨게 된다.)
그리고 사진 아래에는 니체의 국가에 해당하는 대륙을 확인할 수 있다. 누르면

유럽에 대한 정보들이 있고 사진아래에 People에 방금 본 니체가 있음을 볼 수 있다. Who 배열을 만들어주고 추가하는 과정을 만들고 생성한 데이터기 때문에 Who 배열에 있는 것이다. 그러나 Europe 국가에 속하는 인물이 하나 더 있다. 바로

이 인물은 유럽 소속임에도 불구하고 유럽 페이지에 People에 적혀 있지 않다. 계속 말했던 것처럼 one to many 관계설정을 해주기전에 이미 있던 데이터이기 때문에 Who배열에 추가해주는 과정은 물론 애초에 대륙에 관한 정보를 전혀 가지고 있지 않다.

위 사진은 수정 후 이다. 지금은 continent키를 가지고 있지만 이전에는

아예 continent키를 가지지 않음을 확인 할 수 있다. 그래서 위에 말했다싶이 저 인물 태그를 누르면 오류가 떴다.

서론이 길었다. 이제 키를 추가해보는 방법을 알아보겠다.

Document 필드 추가

mongo shell 작업

// db.Collection.updateMany({<filter>},{ $set: {<update>}})


db.peoples.update({Name: "Winston Churchill"} (수정할 데이터 선택), { $set: { (추가할 필드)"continent": (추가할 필드 값) new ObjectId("63ff2d710a6f143fd1cc527f")}})

db.peoples.update({Name: "Winston Churchill"}, { $set: { "continent": new ObjectId("63ff2d710a6f143fd1cc527f")}})

위 코드로 처칠의 모델에 continent와 해당 continent에 해당하는 id를 추가해주었고 continent 필드와 그 안에 정보를 넣을 수 있다.

이 과정으로 아래와 같이 continent 키가 생성 되었다.

정보에 대륙은 추가되었다.
이제 아까 오류가 떴던 인물 태그를 클릭하면

continent: Europe이 명시되었음을 볼 수 있다.

그러나 한 가지 과정이 더 남았는데

처칠의 모델에 continent를 추가헸음에도 Europe대륙의 해당되는 인물에 처칠은 뜨지 않는다. 왜냐하면

continent 모델의 인물을 저장해주는 one to many의 many에 속하는 Who배열에 인물 정보를 추가하지 않았기 때문이다. 이 작업은

// db.continents.updateOne({field}, {$push: { [update] } })

> db.continents.updateOne( { name: "America" },   { $push: { Who: ObjectId("63e762613709ccf0e2a2542a")} })

요렇게 배열에 인물 id를 추가해주면

{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 } 

업데이트 되었음을 알려주고


모든 인물이 명시됨을 확인 할 수 있다.

이후 다른 대륙들도 같은 작업을 진행하여 주면 america, asia 등 모두 같은 결과를 받을 수 있었다.

profile
I want to be a Backend Developer (run start-up)

0개의 댓글