복붙노트

[MONGODB] MongoDB의 문서에서 기준과 일치하는 Upsert 배열 요소?

MONGODB

MongoDB의 문서에서 기준과 일치하는 Upsert 배열 요소?

나는 MongoDB의 문서에서 기준과 일치하는 배열 요소를 업데이트하려면 어떻게 당으로?

나는 1 나던 경기 후 삽입 그래서 만약, 그렇지 않으면 업데이트, 배열 요소를 upsert 싶다.

나는 그 질문에 대한 대답을 시도하고, 배열 요소가 이미 존재하면 그것을 잘 작동합니다. 요소 나던 그때 존재하는 경우는 배열 필드에서 "$"의 자식을 만듭니다.

다음과 같이 내 몽고의 구조는 다음과 같다 :

Widget (collection)
--Name
--Properties (array)
  --Name
  --Value

내 응용 프로그램 위젯 이름과 WebService를 호출에서 속성의 목록을 가져옵니다. 나는 제공된 속성을 반복하고 이름이 이미 존재하는 경우 MongoDB의 값을 업데이트하거나 나던 경우 속성 배열에 새 속성을 삽입하고 싶습니다.

해결법

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

    1.당신이 필요로하는 일부 응용 프로그램 측 로직없이 하나의 업데이트를 사용 할 수 없습니다. 자동 경우 새로운 위젯 문서에 제공된 이름 없음 존재를 만들려하지 않는 한 기능으로 upsert이 특정 문제에 대한 관련되지 않습니다.

    당신이 필요로하는 일부 응용 프로그램 측 로직없이 하나의 업데이트를 사용 할 수 없습니다. 자동 경우 새로운 위젯 문서에 제공된 이름 없음 존재를 만들려하지 않는 한 기능으로 upsert이 특정 문제에 대한 관련되지 않습니다.

    당신이로 실행중인 문제는 당신이 배열 요소의 존재 여부에 따라 두 가지 업데이트를 수행 할 수없는 기능이 없다는 것입니다. 유일한 두 가지 옵션이 있습니다 :

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

    2.당신은 원자 배열 요소를 upsert 수 없습니다. 당신이 배열 대신 개체를 사용하여 문서를 재구성 수 있다면, 이것은 원자 가능하다. 당신의 표기법을 사용하면, 구조는 것

    당신은 원자 배열 요소를 upsert 수 없습니다. 당신이 배열 대신 개체를 사용하여 문서를 재구성 수 있다면, 이것은 원자 가능하다. 당신의 표기법을 사용하면, 구조는 것

    Widget (collection)
      --Name
      --Properties
        --Property1
        --Property2
            .
            :
    

    예 문서는 것

    {
        name: 'widget-1',
        properties: {
            'property-1': 100,
            'property-2': 200
        }
    }
    

    값 300 '속성-3'라는 항목을 upsert, 당신은 할 것

    db.widgets.update(
        { name: 'widget-1' }, 
        { $set: { 'properties.property-3': 300 } }
    )
    

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

    db.widgets.update(
        { name: 'widget-1' }, 
        { 
            $set: { 'properties.property-3': 300 },
            $addToSet: { propertyNames: 'property-3' }
        }
    )
    

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

    db.widgets.update(
        { name: 'widget-1' }, 
        { 
            $unset: { 'properties.property-3': true },
            $pull: { propertyNames: 'property-3' }
        }
    )
    
  3. ==============================

    3.그것은 나를 위해 작동 PHP에서 적어도 언어로 채택하려고합니다. 당신은 같은 컬렉션의 모습이 필요합니다 :

    그것은 나를 위해 작동 PHP에서 적어도 언어로 채택하려고합니다. 당신은 같은 컬렉션의 모습이 필요합니다 :

            {Name: x, Properties: {name1:value1, name2:value2, name3:value3}}
    
            foreach ($Properties as $name => $value)
            {
                $propertiesArray["Properties.$name"] = $value;                
            }   
    
            $criteria  = array('Name' => $name);
            $operation = array('$set'   => $propertiesArray);
            $options   = array('upsert' => true);
    
            $collection = $this->_dbh->selectCollection('Widget');
            $collection->update($criteria, $operation, $options);
    

    그것은는 이미 사람들을하지 존재하는 경우 새 이름을 삽입 및 업데이트

  4. from https://stackoverflow.com/questions/8871363/upsert-array-elements-matching-criteria-in-a-mongodb-document by cc-by-sa and MIT license