2013-01-06 2 views
1

Morphia를 사용하면 배열에 포함 된 객체에 saveOrUpdate/upsert 작업을 수행 할 수 있습니까?morphia : upsert on 배열에 포함 된 객체

{ 
_id : "abcd", 
myArray : [{ 
     "key" : "areaTotal", 
     "value" : "101.9", 
     "label" : "Total area (municipality)" 
    }, { 
     "key" : "areaUrban", 
     "value" : "803", 
     "label" : "Total area (urban)" 
    }, { 
     "key" : "populationDensity", 
     "value" : "15991", 
     "label" : "Population desnsity" 
    } 
] 
} 

다른 개체 같은

{ 
     "key" : "areaUrban", 
     "value" : "123", 
     "label" : "a new label" 
} 

에 의해 키 "areaUrban"와 예를 배열 요소에 대한 대체하는 깨끗한 방법이 지금은 거기에 내가 할 :

은 다음 문서를 고려 두 가지 업데이트 작업에서 먼저 삭제 한 다음 추가 :

UpdateOperations<T> ops = createUpdateOperations().removeAll("myArray ", new BasicDBObject("key", "areaUrban")); 
update(createQuery().field("_id").equal(myObjId),ops); 
UpdateOperations<T> ops2 = createUpdateOperations().add("myArray ", myReplacementObject); 
update(createQuery().field("_id").equal(myObjId),ops2); 

어느 것이 잘 작동 하나만 하나의 업데이트 op (morphia 또는 일반 mongo java 드라이버 중 하나)에서 할 수 있습니까?

또한 일치하는 개체가 원래 배열에 없으면 myReplacementObject 개체를 배열에 추가해야합니다.

감사 $ positional operator

답변

1

:

db.test.update({_id: "abcd", "myArray.key": "areaUrban"}, {$set: {"myArray.$.value": 123, "myArray.$.label": "a new label"}}) 


[편집] JohnnyHK이 코멘트에 언급 된 바와 같이 존재하지 않는 경우이 중첩 된 문서를 upsert하지 않습니다.

+0

upsert의 업데이트 부분에서 작동하지만 존재하지 않는 경우 새 요소를 만들지 않습니다. – JohnnyHK

+1

음, 좋은 지적이야. 그 주위에 방법이없는 것 같습니다. 하나의 쿼리에서 끌어 오기/밀어 넣기를 수행하는 것도 허용되지 않습니다. 위치 연산자에 upserts를 추가 할 수있는 티켓이 있습니다. https://jira.mongodb.org/browse/SERVER-3326 –

+0

감사합니다. 희망 그들은 그들이 곧이 기능을 추가 :). – azpublic