Doctrine ODM查询生成器 - 使用两个字段的总和更新字段

时间:2012-06-26 18:31:15

标签: mongodb doctrine-orm query-builder doctrine-odm

基本上尝试做同样的事情:

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设置为字符串“column1 + column2”。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,$inc$set都不会对此有所帮助,因为他们期望字面值。我也不认为findAndModify会有所帮助,因为它使用与update()相同的修饰符对象。

我认为map / reduce也不合适,因为这不是为了修改被映射的文档。

如果您不在分片基础结构中,可以使用db.eval()以原子方式获取和更新对象;但是,这不是一种选择。

我建议将其拆分为两个查询。首先,通过sitetimestamp_id找到对象。您可以将返回的字段限制为column1column2。然后,在column1column2上使用相同的条件加上发布更新,并将column3设置为其总和。如果在查找和更新查询之间更改了这些字段,则在更新条件中添加column1column2将确保您不会无意中存储无效内容。实际上,您的更新查询变为idempotent

相关问题