복붙노트

[MONGODB] upsert 배열 데이터를 몽고 수 있습니까?

MONGODB

upsert 배열 데이터를 몽고 수 있습니까?

나는이 같은 몽고 문서가 있습니다.

{
    "_id" : ObjectId("50b429ba0e27b508d854483e"),
    "array" : [
        {
            "id" : "1",
            "letter" : "a"
        },
        {
            "id" : "2",
            "letter" : "b"
        }
    ],
    "tester" : "tom"
}

나는 삽입 단일 몽고 명령을 사용하여 배열을 업데이트 할 수 싶은 물체의 존재 여부에 따라 발견 ()를 실행 삽입 () 및 업데이트 () 내에서 조건을 사용할 수 없습니다.

ID는 내가 선택로 원하는 항목입니다. 나는이와 배열을 업데이트한다면 :

{
    "id" : "2",
    "letter" : "c"
}

나는 $ 세트 문을 사용해야합니다

db.soup.update({
    "tester":"tom",
    'array.id': '2'
}, {
    $set: {
        'array.$.letter': 'c'
    }
})

그리고 배열에 새로운 객체를 삽입 할 경우

{
    "id" : "3",
    "letter" : "d"
}

나는 $ 푸시 문을 사용해야합니다

db.soup.update({
    "tester":"tom"
}, {
    $push: {
        'array': {
            "id": "3",
            "letter": "d"
        }
    }
})

나는 배열 항목에 대한 upsert의 일종이 필요합니다.

내가 프로그래밍이 일을하거나 내가 하나의 몽고 호출하여이 작업을 수행 할 수 있습니까?

해결법

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

    1.나는 당신이 가능성이 응용 프로그램 코드에서이 문제를 처리해야합니다, 그래서 MongoDB를 2.2에서와 같은 포함 된 배열로 upsert 것이다 옵션의 인식 아니에요.

    나는 당신이 가능성이 응용 프로그램 코드에서이 문제를 처리해야합니다, 그래서 MongoDB를 2.2에서와 같은 포함 된 배열로 upsert 것이다 옵션의 인식 아니에요.

    가상 모음의 종류로 포함 된 배열을 처리 할 점을 감안, 대신 별도의 컬렉션으로 배열을 모델링하는 것이 좋습니다.

    당신은 내장 된 배열 내에서 필드 값을 기반으로 upsert을 할 수는 없지만 이미 존재하지 않는 경우 포함 된 문서를 삽입 $ addToSet을 사용할 수 있습니다 :

    db.soup.update({
        "tester":"tom"
    }, {
        $addToSet: {
            'array': {
                "id": "3",
                "letter": "d"
            }
        }
    })
    

    즉, 배열 요소의 id로 일치의 정확한 사용 사례에 적합하지 않지만, 당신이 예상되는 현재의 값을 알고있는 경우에 유용 할 수 있습니다.

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

    2.난 그냥이 문제를 자신에 달렸다. 나는 한 통화 솔루션을 찾을 수 없습니다,하지만 난 당신이 당신의 배열 요소에 고유 한 값을 가질 때 작동하는 두 개의 통화 솔루션을 발견했다. 배열의 요소를 제거 먼저 $ 풀 명령하고 푸시 $를 사용한다.

    난 그냥이 문제를 자신에 달렸다. 나는 한 통화 솔루션을 찾을 수 없습니다,하지만 난 당신이 당신의 배열 요소에 고유 한 값을 가질 때 작동하는 두 개의 통화 솔루션을 발견했다. 배열의 요소를 제거 먼저 $ 풀 명령하고 푸시 $를 사용한다.

    db.soup.update({
        "tester":"tom"
    }, {
        $pull: {
            'array': {
                "id": "3"
            }
        }
    })
    db.soup.update({
        "tester":"tom"
    }, {
        $push: {
            'array': {
                "id": "3",
                "letter": "d"
            }
        }
    })
    

    문서가 존재하지만 배열의 항목이 존재하지 않으며, 항목이 존재하는 경우 때 문서가 존재하지 않는 경우에 작동합니다.

    당신이 뭔가가 있다면 다시 말하지만, 이것은 단지 배열의 요소에서 고유해야이 예에서 ID 필드처럼 작동합니다.

  3. ==============================

    3.사용 대신 배열의 객체에이 문서를 재구성 할 수 있다면 당신은 어떤 경우에 포함 된 문서 세트의 upserts를 얻을 수 있습니다. 난 그냥 다른 질문에 대답하지만 편의를 위해 여기에 적응합니다.

    사용 대신 배열의 객체에이 문서를 재구성 할 수 있다면 당신은 어떤 경우에 포함 된 문서 세트의 upserts를 얻을 수 있습니다. 난 그냥 다른 질문에 대답하지만 편의를 위해 여기에 적응합니다.

    예 문서는 것

    {
        tester: 'tom',
        items: {
            '1': 'a',
            '2': 'b'
        }
    }
    

    ID 3과 가치 'C'와 항목을 upsert, 당신은 할 것

    db.coll.update(
        { tester: 'tom' }, 
        { $set: { 'items.3': 'c' } }
    )
    

    한 가지 단점은 필드 이름을 쿼리합니다 ($를 사용하여 쿼리 연산자를 존재) 스캔을 필요로한다는 것이다. 당신은 여분의 배열 필드 즉, 저장 속성 이름을 추가하여이 주위를 얻을 수 있습니다. 이 필드는 색인이 정상적으로 조회 할 수 있습니다. 될 Upserts

    db.coll.update(
        { tester: 'tom' }, 
        { 
            $set: { 'items.3': 'c' },
            $addToSet: { itemNames: 3 }
        }
    )
    

    속성을 제거 어레이에서뿐만 아니라 그것을 끌어가 (마음 $ addToSet에 보관하는 것은 O (n은)입니다.).

    db.widgets.update(
        { tester: 'tom' }, 
        { 
            $unset: { 'items.3': true },
            $pull: { itemNames: 3 }
        }
    )
    
  4. ==============================

    4.이봐, 당신은 배열 필터 옵션을 사용하여 수행 할 수 있습니다. 당신은 여기에서 참조 할 수 있습니다 https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-arrayfilters.

    이봐, 당신은 배열 필터 옵션을 사용하여 수행 할 수 있습니다. 당신은 여기에서 참조 할 수 있습니다 https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-arrayfilters.

       db.getCollection('soup').update({'tester':tom}, { $set: { "collection.$[element].letter" : 'c' } },
       {
         arrayFilters: [ { "element.id": 2 } ]
       })
    
  5. from https://stackoverflow.com/questions/13588342/can-mongo-upsert-array-data by cc-by-sa and MIT license