인프런 커뮤니티 질문&답변

jjongrrr님의 프로필 이미지
jjongrrr

작성한 질문수

mongoDB 기초부터 실무까지(feat. Node.js)

debug 모드 설정하기

안녕하세요 강의 잘 보고 있습니다 질문 하나 드립니다

작성

·

192

1

이번 강의 내용은 아니지만 여러가지  해보다가 궁금해서 질문 드립니다 

혹시 모델안에 배열이 있을 경우 배열안에 특정 id를 검색해서 그것만 수정하는 방법이 있을까요 ?

배열안에 추가는 $push와 삭제는 $pull로 잘 되는데...

수정하려고 보니  id 검색 후  배열 안의 객체 id를 또 검색해야 하는데 아무리 검색해봐도 방법을 모르겠네요 ㅠ..

 

지금 모델 구조는 이렇게 되어있구요 

const UserSchema = new mongoose.Schema({
    username: {
        type: String,
        required: true,
        unique: true,
    },
    name: {
        first: { type: String, required: true,},
        last: { type: String, required: true, }
    },
    age: Number,
    email: String,
    array: [
        { name: { type: String } }
    ]
}, {
    timestamps: true,
})

백엔드 코드는 이렇게 요청하고 있습니다 

// test
        app.post('/api/user/test/:userId', async(req, res) => {
            try {
                const { userId } = req.params;
                const user = await User.findByIdAndUpdate(userId, {
                    $push: { array: { name: req.body.name } }
                }, {new: true})
                res.json(user)

            } catch(err) {
                console.log(err)
            }
        })

        app.put('/api/user/test/:userId', async(req, res) => {
            try {
                const { userId } = req.params;
                const user = await User.findOneAndUpdate(userId, {
                    // $pull: { //삭제
                    //     array: { _id: '61c1f85f11fb31321cc79973' }
                    // }

                   
                }, { new: true })

                res.json(user)
            } catch(err) {
                console.log(err)
            }
      })

위에 코드는 삭제 코드인데 ..삭제는 조건만 적으면 되니 해당 아이디를 찾아서 pull이 됩니다 

아이디를 찾아서 array안에 name 을 수정하고 싶은데 혹시 어떻게 해야 될까요 ? 

답변 1

1

 

User.findOneAndUpdate({_id: userId, "array.name":"old_name"}, { "array.$.name":"new_name"}, { new: true})

 

이렇게 하시면 됩니다! "array.name":"old_name" 이 부분이 array 배열 안에 있는index를 탐색하는거에요. 두번째에서 $가 탐색된 index의 element를 가리키는거고요. 만약 탐색을 여러조건으로 하고 싶으시면 elementMatch였나 이걸로 하면 되요. 강의에서 다루는 부분이니 찾아보시면 될거 같아요!

jjongrrr님의 프로필 이미지
jjongrrr
질문자

정말 감사합니다 !!! 강의 넘 좋아용

jjongrrr님의 프로필 이미지
jjongrrr

작성한 질문수

질문하기