복붙노트

[MONGODB] 배열에 배열에서 항목을 업데이트

MONGODB

배열에 배열에서 항목을 업데이트

나는이 같은 MongoDB의 컬렉션에서 문서를 가지고 :

{
    sessions : [
        {
            issues : [ 
                {
                    id : "6e184c73-2926-46e9-a6fd-357b55986a28",
                    text : "some text"
                },   
                {
                    id : "588f4547-3169-4c39-ab94-8c77a02a1774",
                    text : "other text"
                }
            ]
        } 
    ]
} 

그리고 첫 번째 세션의 ID 588f4547-3169-4c39-ab94-8c77a02a1774으로 문제를 업데이트 할.

문제는 내가 단지 그것이 첫 번째 세션 및 문제 아이디의 것을 알고 있다는 것입니다 (NOT 문제의 인덱스!)

나는 이런 식으로 뭔가를 시도 그래서 :

db.mycollection.update({ "sessions.0.issues.id" : "588f4547-3169-4c39-ab94-8c77a02a1774"}, 
                       { $set: { "sessions.0.issues.$.text" : "a new text" }})

그러나 나는 다음과 같은 결과를 얻었다 :

WriteResult({
    "nMatched" : 0,
    "nUpserted" : 0,
    "nModified" : 0,
    "writeError" : {
        "code" : 16837,
        "errmsg" : "The positional operator did not find the match needed from the query. Unexpanded update: sessions.0.issues.$.text"
    }

이걸 어떻게 할 수 있습니까?

도와 줘서 고마워.

해결법

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

    1.이 (분명히 상당) 쿼리를 사용해야합니다 :

    이 (분명히 상당) 쿼리를 사용해야합니다 :

    db.mycollection.update({"sessions.0.issues": {$elemMatch: {id: <yourValue>}}}, {$set: {"sessions.0.issues.$.text": "newText"}})
    

    당신의 업데이트 표현이 정확 것을 알 수 있습니다.

    $ elemMatch에 대한 자세한 정보를 제공합니다.

    BTW, $ 연산자는 "중첩 된 배열을 통과 쿼리"일을하지 않는 것을 MongoDB를 참조 explicits.

    중요 : $ elemMatch는 버전 4 이상에서 작동합니다.

  2. from https://stackoverflow.com/questions/24166615/update-an-item-in-an-array-that-is-in-an-array by cc-by-sa and MIT license