2012-06-26 54 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

相关问题