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만 있는경우는 굳이 필요없다.)
'IT > MongoDB' 카테고리의 다른 글
$rename (Update Operators/Field Update Operators) (0) | 2021.04.12 |
---|---|
$eq 와 $ne (Operatros/Query and Projection Operators/Comparision Query Operators) (0) | 2021.04.12 |
JSON.parse() 활용하여 몽고디비 필드 동적 생성 (0) | 2021.04.11 |
몽고디비 - findOneAndUpdate (0) | 2020.06.13 |
MONGODB - aggregate (0) | 2020.06.13 |