복붙노트

[MONGODB] 포함 된 문서에 'upsert'

MONGODB

포함 된 문서에 'upsert'

저는 현재 다음과 같은 데이터 세트를 가지고 :

{  
    'component_id':1,  
    '_locales':[   
        {  
            'url': 'dutch',  
            'locale': 'nl_NL'  
        } 
    ] (etc)
}

나는 비슷한 뭔가를 실행할 것 로케일로 행을 업데이트하려면 :

db.components.update(
    {'component_id': 1, '_locales.locale': 'nl_NL'},
    {$set: {'_locales.$': {'url': 'new url','locale':'nl_NL'}}, 
    true
);

로케일이 존재하지 않을 때까지이 잘 작동합니다 :

db.components.update(
    {'component_id': 1, '_locales.locale': 'en_US'},
    {$set: {'_locales.$': {'url': 'new url','locale':'en_US'}}, 
    true
);

component_id에 고유 인덱스가 있기 때문에이 중복 키에 대해 불평 예외가 발생합니다.

자동으로 다른 로케일로 새로운 '문서'를 추가하고 이미 존재하는 경우이를 업데이트하는 방법이 있나요? 'upserting'와 위치 연산자하지 않습니다 작업을 사용하여 문서에 따르면.

해결법

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

    1.당신은 세트가 있는지 중복 배열 요소가없는 만들기 위해 추가 $ addToSet을 사용할 수 있지만 당신의 "업데이트"경우에 작동하지 않습니다.

    당신은 세트가 있는지 중복 배열 요소가없는 만들기 위해 추가 $ addToSet을 사용할 수 있지만 당신의 "업데이트"경우에 작동하지 않습니다.

    당신이 원하는 일을하기 위해, 당신은 같은 당신의 데이터 구조를 변경해야합니다 :

    {
        "_id" : ObjectId("4f9519d6684c8b1c9e72e367"),
        "component_id" : 1,
        "_locales" : {
            "nl_NL" : {
                "url" : "dutch"
            }
        }
    }
    

    이제 당신은 단지와 NL_NL 로케일에 대한 업데이 트를 수행 할 수 있습니다

    db.components.update( { component_id: 1 }, { $set: { '_locales.nl_NL.url' : 'new url' } }, true );
    

    그리고 새로운 로케일은와 마찬가지로 잘 작동합니다 :

    db.components.update( { component_id: 1 }, { $set: { '_locales.en_US.url' : 'American' } }, true );
    

    당신처럼뿐만 아니라, 아마도 중첩 된 개체의 일부로서 로케일을 데 고려할 수 있습니다 :

    {
        "_id" : ObjectId("4f9519d6684c8b1c9e72e367"),
        "component_id" : 1,
        "_locales" : {
            "nl_NL" : {
                "url" : "dutch"
                "locale" : "nl_NL"                 
            }
        }
    }
    

    이것은 쉽게 어떤 경우에는 데이터를 검색 할 수 있습니다.

  2. from https://stackoverflow.com/questions/10277174/upsert-in-an-embedded-document by cc-by-sa and MIT license