IT/MongoDB

$unset (Field Update Operators)

KeepGooing 2021. 4. 12. 13:39
반응형

array 안의 요소 지우는 방법

(How to remove an array element in mongodb)

이 것만 알아도 실무에서 몽고디비 30% 먹고들어간다. 사실상 delete 함수 update로 대체하고 있다 수정은 말할 것도 없고 따라서 update함수의 Operators만 잘 알고 있으면 필드 수정과 삭제와 관련해서 몽고디비 데이터를 마음대로 조작할 수 있다.

배워야할 것이 많지만 주로쓰는 것 위주로 파악하면 학습효과를 극대화 시키고 학습의 선순환을 이룩할 수 있기에 반드시 파악해보자

 

{
    "_id" : ObjectId("5f856dc29e4ddf87b95dc538e"),
    "intent" : "Library",
    "typeArray" : [ 
        {
            "reqType" : "type1",
            "executeInfo" : [ {
                  "serviceType" : "webLink",
                    "serviceData" : [ 
                        {
                            "searchData" : {
                                "libName" : "test"
                            }
                        }
                  }
            ]
        }
    ]
}

 

executeInfo의 serviceType이 webLink인 배열값을 통재로 지우고 싶다면 어떻게 해야할까

typeArray와 executeInfo 두개의 리스트가 있다.

일반적으로 json Object의 경우 dot notation으로 접근할 수 있지만

리스트의 경우 수많은 json Object를 가질 수 있으므로 프로그램 입장에서 어떤 것을 접근해야할지 모를 수 있다.

따라서 이정표를 주는 데 이때 쓰는 것이 arrayFilters이다.

쿼리를 작성하면 다음과 같다.

 

 

db.getCollection('intent_service').updateOne(
{intent:"Library", "typeArray.executeInfo.serviceType" :"webLink"},
{$unset:{"typeArray.$[position].executeInfo.$":1}},
{arrayFilters:[{"position.reqType":"type1"}]}
)

 

 

typeArray에서 reqType이 type1인 것만 접근해! 라고 이정표를 제시해주고

뒤어 executeInfo의 경우는 따로 이정표를 제시하지 않아도 앞서 작성한 {intent:"Libaray", "typeArray.executeInfo.serviceType" :"webLink"}의 필터 값만으로 모두 탐색해 관련 값을 찾는다.

물론 executeInfo 다음 또다시 리스트형태의 식별자가 나온다면 executeInfo에 대해 이정표를 제시해야 할 수 있다.

 

포인트는 다음과 같다.

 

json object의 형태는 dot notation -> '.' 으로 식별자를 목표하는 식별자의 값에 접근 가능하지만

array의 형태인 경우 arrayFilters를 활용해서 이정표를 제시해줘야 한다. (물론 한개의 array만 있는경우는 굳이 필요없다.)

반응형