[MONGODB] MongoDB의 문서에서 기준과 일치하는 Upsert 배열 요소?
MONGODBMongoDB의 문서에서 기준과 일치하는 Upsert 배열 요소?
나는 MongoDB의 문서에서 기준과 일치하는 배열 요소를 업데이트하려면 어떻게 당으로?
나는 1 나던 경기 후 삽입 그래서 만약, 그렇지 않으면 업데이트, 배열 요소를 upsert 싶다.
나는 그 질문에 대한 대답을 시도하고, 배열 요소가 이미 존재하면 그것을 잘 작동합니다. 요소 나던 그때 존재하는 경우는 배열 필드에서 "$"의 자식을 만듭니다.
다음과 같이 내 몽고의 구조는 다음과 같다 :
Widget (collection)
--Name
--Properties (array)
--Name
--Value
내 응용 프로그램 위젯 이름과 WebService를 호출에서 속성의 목록을 가져옵니다. 나는 제공된 속성을 반복하고 이름이 이미 존재하는 경우 MongoDB의 값을 업데이트하거나 나던 경우 속성 배열에 새 속성을 삽입하고 싶습니다.
해결법
-
==============================
1.당신이 필요로하는 일부 응용 프로그램 측 로직없이 하나의 업데이트를 사용 할 수 없습니다. 자동 경우 새로운 위젯 문서에 제공된 이름 없음 존재를 만들려하지 않는 한 기능으로 upsert이 특정 문제에 대한 관련되지 않습니다.
당신이 필요로하는 일부 응용 프로그램 측 로직없이 하나의 업데이트를 사용 할 수 없습니다. 자동 경우 새로운 위젯 문서에 제공된 이름 없음 존재를 만들려하지 않는 한 기능으로 upsert이 특정 문제에 대한 관련되지 않습니다.
당신이로 실행중인 문제는 당신이 배열 요소의 존재 여부에 따라 두 가지 업데이트를 수행 할 수없는 기능이 없다는 것입니다. 유일한 두 가지 옵션이 있습니다 :
-
==============================
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.그것은 나를 위해 작동 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);
그것은는 이미 사람들을하지 존재하는 경우 새 이름을 삽입 및 업데이트
from https://stackoverflow.com/questions/8871363/upsert-array-elements-matching-criteria-in-a-mongodb-document by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB의 응집을 이용하여 한계 정렬 각 그룹 [중복] (0) | 2019.12.25 |
---|---|
[MONGODB] MongoDB의 변경 문서에 대한 통지를 받기 (0) | 2019.12.25 |
[MONGODB] MVC.net에 MongoDB의에서 ObjectId가 전달하는 방법 (0) | 2019.12.25 |
[MONGODB] 몽고에서 유효성 검사 데이터에 대한 가장 좋은 방법은 무엇입니까? (0) | 2019.12.25 |
[MONGODB] 왜 MongoDB를 사용 인덱스 교차합니까? (0) | 2019.12.25 |