2012-06-26 55 views
0

基本的和更新領域嘗試做相同的:Doctrine2 ODM的QueryBuilder - 有兩個字段

UPDATE table SET column3 = column1 + column2; 

在Doctrine2的ODM的QueryBuilder - 是像這可能與出的MapReduce?我有一個分片集合,所以我需要使用QueryBuilder才能通過我的複合分片鍵進行搜索。

簡體〔實施例:

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

不幸的是,這將設置column3字符串 「列1 +列2」。有任何想法嗎?

回答

1

不幸的是,$inc也不$set將幫助這裏,因爲他們期望字面值。我也不認爲findAndModify會有幫助,因爲它使用與update()相同的修飾符對象。

我不認爲map/reduce是合適的,因爲這不是要修改被映射的文檔。

如果您不在分片基礎結構中,則可以使用db.eval()以原子方式獲取和更新對象;但是,這不是一種選擇。

我會建議把它分成兩個查詢。首先,通過其site,timestamp_id找到對象。您可以限制返回到column1column2的字段。然後,使用相同的標準加上發佈更新column1column2的匹配,並將column3設置爲它們的總和。在更新條件中添加column1column2將確保您不會在查找和更新查詢之間更改這些字段時無意中存儲無效數據。實際上,您的更新查詢變爲idempotent

+0

感謝您的迴應!是的,我希望避免第二個問題 - 但你的方法是有道理的。 – kmfk

相關問題