복붙노트

[MONGODB] MongoDB의에서 중첩 된 배열을 업데이트

MONGODB

MongoDB의에서 중첩 된 배열을 업데이트

나는 갱신, 이런 식으로 뭔가를해야한다는 객체의 2 수준 깊은 중첩 된 배열하여 MongoDB에서 문서를 가지고 :

{
    id: 1,
    items: [
        {
            id: 2,
            blocks: [
                {
                    id: 3
                    txt: 'hello'
                }
            ]
        }
    ] 
}

한 레벨 만 깊이 배열가 있었다면 내가 유일한 옵션 I의 한이 와서 거기에 있지만 두 번째 수준에 대한 업데이트 객체에 대한 위치 연산자를 사용할 수있는 것은 다음과 같이 중첩 된 객체의 인덱스 위치 연산자를 사용하는 것입니다 :

db.objects.update({'items.id': 2}, {'$set': {'items.$.blocks.0.txt': 'hi'}})

이 방법은 작동하지만 내가 색인 100000 말을 보낼 수 있습니다 클라이언트에서 와야 웹 서비스 및 인덱스 번호를 짓고 있어요 때문에 나에게 위험한 것이가 null 값 100000 개 인덱스 배열을 만들 MongoDB를 강제 할 것이다.

내가 쿼리에서 사용하기 전에 인덱스가 범위 외에있는 경우 확인하는 개체의 ID 대신에 그것의 위치 또는 어쩌면 방법을 참조 할 수 있습니다와 같은 중첩 된 개체를 업데이트 할 수있는 다른 방법이 있습니까?

해결법

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

    1.여기에 큰 문제는 당신은 몽고의 "addToSet"와 "푸시"작업에 활용해야합니까,입니까? 당신이 정말로 배열에 단지 개별 항목을 수정하려는 경우, 당신은 아마 객체로 이러한 배열을 구축해야한다.

    여기에 큰 문제는 당신은 몽고의 "addToSet"와 "푸시"작업에 활용해야합니까,입니까? 당신이 정말로 배열에 단지 개별 항목을 수정하려는 경우, 당신은 아마 객체로 이러한 배열을 구축해야한다.

    여기에 내가이 구조 할 방법은 다음과 같습니다

    {
        id: 1,
        items: 
            { 
              "2" : { "blocks" : { "3" : { txt : 'hello' } } },
              "5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
            }
    }
    

    JSON에있는이 기본적으로 변환 모든 것을 대신 배열의 객체. 당신은 $ 밀고 $ addToSet를 사용할 수있는 능력을 상실하지만 난이 쉽게 모든 것을하게 생각합니다. 예를 들어, 쿼리는 다음과 같을 것이다 :

    db.objects.update가 ({ 'items.2은'{$가 존재 :} 사실}, { '$ 세트': { 'items.2.blocks.0.txt': '안녕하세요'}})

    또한 나는 "ID를"덤프 한 것을 알 수 있습니다. 이 같은 중첩 일을있을 때 당신은 일반적으로 단순히 인덱스로 해당 번호를 사용하여 "ID"를 대체 할 수 있습니다. 은 "ID"개념은 이제 암시한다.

    이 기능은 표현 업데이트 3.6에 추가되었습니다.

    db.objects.update ({ID : 1}, {$ 세트 { '항목 $ [ITM] .blocks $ [BLK]이 .txt.. ""안녕하세요 "}}, {다 : 거짓을 arrayFilters : { 'itm.id'2}, { "blk.id ': 3}]})

  2. ==============================

    2.사용중인 ID는 선형 수 있습니다 그것은 추가 필드 등 'max_idx'또는 이와 유사한 같은 곳에서 온있다. ID와 다음 업데이트에 대한이 수단 일 조회. UUID / ObjectId가 당신뿐만 아니라 CRUD를 분산 사용할 수 있도록합니다 IDS 사용할 수 있습니다.

    사용중인 ID는 선형 수 있습니다 그것은 추가 필드 등 'max_idx'또는 이와 유사한 같은 곳에서 온있다. ID와 다음 업데이트에 대한이 수단 일 조회. UUID / ObjectId가 당신뿐만 아니라 CRUD를 분산 사용할 수 있도록합니다 IDS 사용할 수 있습니다.

  3. from https://stackoverflow.com/questions/4121666/updating-nested-arrays-in-mongodb by cc-by-sa and MIT license