programing

MongoDB - 중첩 배열의 개체 업데이트

padding 2023. 5. 8. 21:55
반응형

MongoDB - 중첩 배열의 개체 업데이트

{
  "_id": "xPBc4By8FemDwTPqH",
  "u": {
    "_id": "6PoZawHZcQz4Gwzcv",
    "username": "michael"
  },
  "friends": [
    {
      "u": {
        "_id": "eGqDjAjjtYADbuSnn",
        "username": "michael",
        "name": "michael"
      }
    },
    {
      "u": {
        "_id": "k4gKCGwYryXDMMHvs",
        "username": "joyce",
        "name": "joyce"
      }
    }
  ]
}

"friends.u.username"의 이름을 업데이트하고 싶습니다: "michael"의 이름은 "안녕하세요"입니다. 어떻게 해야 하는지요.

연산자를 업데이트의 위치 연산자와 함께 적용하여 다음을 변경합니다.name들판.

위치 연산자는 배열에서 요소의 위치를 명시적으로 지정하지 않고 업데이트할 배열에서 올바른 요소를 식별하므로 최종 업데이트 문은 다음과 같이 표시됩니다.

db.collection.update(
    { "friends.u.username": "michael" }, 
    { "$set": { "friends.$.u.name": "hello" } }
)

둘 이상의 요소가 필터와 일치할 때 배열의 여러 요소를 업데이트하려면 옵션과 함께 구문을 사용할 수 있습니다.다음은 "친구" 배열에서 일치하는 모든 요소를 업데이트합니다.

db.collection.update(
    { "friends.u.username": "michael" },
    { "$set": { "friends.$[elem].u.name": "hello" } },
    { 
      "arrayFilters": [{ "elem.u.username": "michael" }], 
      "multi": true 
    }
)

$[elem]구문은 옵션의 지정된 필터와 일치하는 배열 요소를 식별합니다.multi: true선택사항이 추가되어 일치하는 모든 문서를 업데이트할 수 있습니다.

$set 연산자를 사용할 수 있습니다.

> db.test.update({"friends.u._id":"eGqDjAjjtYADbuSnn"},{$set:{"friends.$.u.name":"hello"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

아래는 테스트한 대로 잘 작동합니다.

먼저 배열의 현재 값을 확인합니다.

db.test.findOne({"friends.u.id" : "eGqDjAjjtYADbuSnn"},{"friends.u.name":1})

이제 update 명령을 실행합니다.

db.test.update({"friends.u.id" : "eGqDjAjjtYADbuSnn"},{$set:{"friends.$.u.name":"hello"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

이제 결과를 다시 확인하여 업데이트 값의 유효성을 확인합니다.

db.test.findOne({"friends.u.id" : "eGqDjAjjtYADbuSnn"},{"friends.u.name":1})

이게 도움이 되길 바랍니다.

만약 당신이 파이썬을 사용하고 있다면, 나는 새로운 업데이트를 생성하기 위해 이 함수를 만들었습니다.

def generate_set_to_update_document(field: str, changes: dict) -> dict:
    new_set = {}
    for change in changes.keys():
        new_set[f"{field}.$.{change}"] = changes[change]
    return new_set

언급URL : https://stackoverflow.com/questions/34431435/mongodb-update-an-object-in-nested-array

반응형