基本上尝试做同样的事情:
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”。有什么想法吗?
答案 0 :(得分:1)
不幸的是,$inc
和$set
都不会对此有所帮助,因为他们期望字面值。我也不认为findAndModify会有所帮助,因为它使用与update()
相同的修饰符对象。
我认为map / reduce也不合适,因为这不是为了修改被映射的文档。
如果您不在分片基础结构中,可以使用db.eval()以原子方式获取和更新对象;但是,这不是一种选择。
我建议将其拆分为两个查询。首先,通过site
,timestamp
和_id
找到对象。您可以将返回的字段限制为column1
和column2
。然后,在column1
和column2
上使用相同的条件加上发布更新,并将column3
设置为其总和。如果在查找和更新查询之间更改了这些字段,则在更新条件中添加column1
和column2
将确保您不会无意中存储无效内容。实际上,您的更新查询变为idempotent。