[MONGODB] 어떻게 MongoDB의 문서에서 이중으로 중첩 된 배열에서 요소를 제거합니다.
MONGODB어떻게 MongoDB의 문서에서 이중으로 중첩 된 배열에서 요소를 제거합니다.
나는 다음의 라인을 따라 문서 구조 뭔가를 :
{
"_id" : "777",
"someKey" : "someValue",
"someArray" : [
{
"name" : "name1",
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
]
}
나는 값이 "나를 삭제"로 중첩 된 배열 요소를 삭제합니다.
나는 중첩 $ elemMatch 표현식을 사용하여이 설명과 일치하는 문서를 찾을 수 있습니다 알고 있습니다. 문제가되는 요소를 제거하기위한 쿼리 구문은 무엇인가?
해결법
-
==============================
1.당신이 실제로 업데이 트를 사용하는거야 문제의 항목을 삭제합니다. 더 구체적으로는 배열에서 항목을 제거합니다 $ 풀 명령을 업데이 트를 할 것입니다.
당신이 실제로 업데이 트를 사용하는거야 문제의 항목을 삭제합니다. 더 구체적으로는 배열에서 항목을 제거합니다 $ 풀 명령을 업데이 트를 할 것입니다.
db.temp.update( { _id : "777" }, {$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}} )
여기에서 일어나고있는 "마법"약간이있다. 0.0 사용하면 우리는 우리가 someArray의 0 번째 항목을 수정하는 것을 알고 있음을 나타냅니다. { "이름": "저를 삭제"} 사용하면 우리는 우리가 제거 할 계획이라고 정확한 데이터를 알고 있음을 나타냅니다.
당신이 클라이언트에 데이터를로드 한 후 업데이트를 수행하는 경우이 과정은 잘 작동합니다. 이러한 작업을 수행하는 "일반"쿼리를 수행하려는 경우이 과정은 덜 잘 작동합니다.
나는 일반적으로 당신이 어떤 시점에서 메모리에 원래 있어야 단순히 하위 문서의 업데이트 배열을 인식하는 가장 쉬운 것 같아요.
아래의 첫 번째 의견에 대응하여, 당신은 아마 약간의 데이터 구조를 변경하여 상황에 도움이 될 수 있습니다
"someObjects" : { "name1": { "someNestedArray" : [ { "name" : "value" }, { "name" : "delete me" } ] } }
지금 당신은 {$ 풀을 수행 할 수 있습니다 { "someObjects.name1.someNestedArray을"...
다음은 구조의 문제입니다. MongoDB의는 "하위 배열"을 조작하기위한 아주 좋은 지원하지 않습니다. 귀하의 구조는 객체의 배열을 가지고 있으며, 이러한 객체는 더 많은 개체의 배열을 포함한다.
다음과 같은 구조를 가지고 있다면, 당신은 $ 풀 같은 것들을 사용하여 어려운 시간을 보내려고하고있다 :
array [ { subarray : array [] }, { subarray : array [] }, ]
그런 당신의 구조 외모 및 업데이트 부분 배열을 원하는 경우 두 가지 옵션이 있습니다 :
-
==============================
2.@Melkor 댓글을 달았함에 따라, (아마도 그 자체로 답변해야 함)
@Melkor 댓글을 달았함에 따라, (아마도 그 자체로 답변해야 함)
당신은 인덱스 사용을 모르는 경우 :
{_id: TheMainID, "theArray._id": TheArrayID}, {$pull: {"theArray.$.theNestedArray": {_id: theNestedArrayID}}}
-
==============================
3.다른 예 및 사용은 다음과 같이 될 수있다 :
다른 예 및 사용은 다음과 같이 될 수있다 :
{ "company": { "location": { "postalCode": "12345", "Address": "Address1", "city": "Frankfurt", "state": "Hessen", "country": "Germany" }, "establishmentDate": "2019-04-29T14:12:37.206Z", "companyId": "1", "ceo": "XYZ" }, "items": [{ "name": "itemA", "unit": "kg", "price": "10" }, { "name": "itemB", "unit": "ltr", "price": "20" } ] }
db.getCollection('test').update( {"company.companyId":"1","company.location.city":"Frankfurt"}, {$pull : {"items" : {"name":"itemB"}}} )
db.getCollection('test').find( {"company.companyId":"1","company.location.city":"Frankfurt","items.name":"itemB"}, { "items.$": 1 } )
3.UPDATE : itemB에 대한 업데이트 쿼리 :
db.getCollection('test').update ( {"company.companyId":"1","company.location.city":"Frankfurt","items.name":"itemB"}, { $set: { "items.$[].price" : 90 }}, { multi: true });
-
==============================
4.을 용이하게 업데이트가 포함 된 문서를 포함하는 배열에 MongoDB를 3.6 추가 $ [] 연산자를 사용합니다. 그래서이 문제를 해결할 수 있습니다 :
을 용이하게 업데이트가 포함 된 문서를 포함하는 배열에 MongoDB를 3.6 추가 $ [] 연산자를 사용합니다. 그래서이 문제를 해결할 수 있습니다 :
db.test.update( { _id : "777" }, {$pull : {"someArray.$[].someNestedArray" : {"name":"delete me"}}} )
-
==============================
5.MongoDB를 3.6에서 당신은이 작업을 수행 할 arrayFilters를 사용할 수에 :
MongoDB를 3.6에서 당신은이 작업을 수행 할 arrayFilters를 사용할 수에 :
db.test.update( { _id: "777" }, { $pull: { "someArray.$[elem].someNestedArray": { name: "delete me" } } }, { arrayFilters: [{ "elem.name": "name1"}] } )
또한 https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/index.html#update-all-documents-that-match-arrayfilters-in-an-array 참조
from https://stackoverflow.com/questions/5228210/how-to-remove-an-element-from-a-doubly-nested-array-in-a-mongodb-document by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 가치 MongoDB의 속성 이름을 단축되어 있습니까? (0) | 2019.12.05 |
---|---|
[MONGODB] MongoDB의 통합 프레임 워크를 사용하여 소수점 이하 2 자리까지 반올림 (0) | 2019.12.05 |
[MONGODB] MongoDB를 배열에있는 모든 요소의 필드 삭제 [중복] (0) | 2019.12.05 |
[MONGODB] 몽고 복잡한 정렬? (0) | 2019.12.05 |
[MONGODB] 어떻게 총 수를 얻기 위해 MongoDB를에서 합계를 집계하는? (0) | 2019.12.05 |