복붙노트

[MONGODB] 어떻게 MongoDB의 문서에서 이중으로 중첩 된 배열에서 요소를 제거합니다.

MONGODB

어떻게 MongoDB의 문서에서 이중으로 중첩 된 배열에서 요소를 제거합니다.

나는 다음의 라인을 따라 문서 구조 뭔가를 :

{
"_id" : "777",
"someKey" : "someValue",
"someArray" : [
    {
        "name" : "name1",
        "someNestedArray" : [
            {
                "name" : "value"
            },
            {
                "name" : "delete me"
            }
        ]
    }
  ]
}

나는 값이 "나를 삭제"로 중첩 된 배열 요소를 삭제합니다.

나는 중첩 $ elemMatch 표현식을 사용하여이 설명과 일치하는 문서를 찾을 수 있습니다 알고 있습니다. 문제가되는 요소를 제거하기위한 쿼리 구문은 무엇인가?

해결법

  1. ==============================

    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. ==============================

    2.@Melkor 댓글을 달았함에 따라, (아마도 그 자체로 답변해야 함)

    @Melkor 댓글을 달았함에 따라, (아마도 그 자체로 답변해야 함)

    당신은 인덱스 사용을 모르는 경우 :

        {_id: TheMainID, "theArray._id": TheArrayID}, {$pull: 
        {"theArray.$.theNestedArray": {_id: theNestedArrayID}}}
    
  3. ==============================

    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. ==============================

    4.을 용이하게 업데이트가 포함 된 문서를 포함하는 배열에 MongoDB를 3.6 추가 $ [] 연산자를 사용합니다. 그래서이 문제를 해결할 수 있습니다 :

    을 용이하게 업데이트가 포함 된 문서를 포함하는 배열에 MongoDB를 3.6 추가 $ [] 연산자를 사용합니다. 그래서이 문제를 해결할 수 있습니다 :

    db.test.update(
      { _id : "777" },
      {$pull : {"someArray.$[].someNestedArray" : {"name":"delete me"}}}
    )
    
  5. ==============================

    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 참조

  6. 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