2012-06-26 5 views
0

의 합 업데이트 필드는 동일하게 수행하려고? Sharded 컬렉션을 가지고 있으므로, 컴파운드 샤드 키로 검색하려면 QueryBuilder를 사용해야합니다.Doctrine2 ODM QueryBuilder 두 개의 필드 기본적으로

단순화 exmaple :

$visit = $this->dm->createQueryBuilder('Visit') 
    ->findAndUpdate() 
    ->field('site')->equals($site) 
    ->field('timeStamp')->equals($ts) 
    ->field('_id')->equals($id) 
    ->update() 
    ->field('column3')->set('column1 + column2'); 

불행하게도, 그 문자열 ", 컬럼 1 + 2 열"에 column3을 설정합니다. 어떤 아이디어?

답변

1

리터럴 값을 예상하므로 불행히도 $inc$set도 도움이되지 않습니다. 또한 update()과 동일한 수정 자 개체를 사용하기 때문에 findAndModify이 도움이된다고 생각하지 않습니다.

map/reduce가 적절하다고 생각하지 않습니다. 맵핑되는 문서를 수정하기위한 것이 아니기 때문입니다.

샤드 기반 인프라를 사용하지 않은 경우 db.eval()을 사용하여 개체를 원자 단위로 가져오고 업데이트 할 수 있습니다. 그러나 이것은 선택 사항이 아닙니다.

두 개의 쿼리로 나누는 것이 좋습니다. 먼저 site, timestamp_id으로 개체를 찾습니다. 반환 된 필드는 column1column2으로 제한 할 수 있습니다. 그런 다음 column1column2에 일치하는이있는 업데이트를 발행하고 column3을 합계로 설정하십시오. 업데이트 기준에 column1column2을 추가하면 찾기 및 업데이트 쿼리 사이에서 해당 필드가 변경된 경우 실수로 잘못된 값을 저장하지 않게됩니다. 그리고 효과적으로 업데이트 쿼리는 idempotent이됩니다.

+0

응답 해 주셔서 감사합니다. 그래, 나는 두 번째 쿼리를 피하기를 바랬다.하지만 당신의 접근 방식은 의미가있다. – kmfk