복붙노트

[MONGODB] MongoDB의에서 배열의 내부 배열 내부의 업데이트 포함 된 개체

MONGODB

MongoDB의에서 배열의 내부 배열 내부의 업데이트 포함 된 개체

나는 문서 등이있다

{
    id : 100,
    heros:[
        {
           nickname : "test",
           spells : [
             {spell_id : 61, level : 1},
             {spell_id : 1, level : 2}
           ]
        }
    ]
}

난 안 $는 마법의 수준을 설정할 수 있습니다 : 3 spell_id과 : 1 개 내부의 주문을 별명을 가진 내부 영웅 "이 시험은 내가이 쿼리를 시도했습니다. :

db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, 
{$set:{"heros.spells.$.level":3}});

내가 볼 오류입니다

해결법

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

    1.당신은 단일 레벨 배열의 $ 위치 연산자를 사용할 수 있습니다. 귀하의 경우에는, 당신은 중첩 된 배열 (영웅 배열이며, 각 영웅은 마법 배열을 가지고있는 것을 이내)이있다.

    당신은 단일 레벨 배열의 $ 위치 연산자를 사용할 수 있습니다. 귀하의 경우에는, 당신은 중첩 된 배열 (영웅 배열이며, 각 영웅은 마법 배열을 가지고있는 것을 이내)이있다.

    당신이 배열의 인덱스를 알고있는 경우처럼, 업데이 트를 수행 할 때, 당신은 명시 적으로 인덱스를 사용할 수 있습니다 :

    > db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, {$set:{"heros.0.spells.1.level":3}});
    
  2. ==============================

    2.이 같은 시도 :

    이 같은 시도 :

    db.test.find({"heros.nickname":"test"}).forEach(function(x) {  
        bool match = false;
        for (i=0 ; i< x.heros[0].spells.length ; i++) {
            if (x.heros[0].spells[i].spell_id == 1) 
            {
                x.heros[0].spells[i].level = 3;
                match = true;
            }
        }
        if (match === true) db.test.update( { id: x.id }, x );
    });
    

    분명히 누군가가 업데이트 절 내부 기능을 넣을 수있는 기능을 추가 할 수있는 티켓을 열었지만되지 않았습니다 아직 해결 : https://jira.mongodb.org/browse/SERVER-458

  3. from https://stackoverflow.com/questions/10465849/update-embedded-object-inside-array-inside-array-in-mongodb by cc-by-sa and MIT license