0

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

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”。有任何想法吗?

4

1 回答 1

1

不幸的是,这里也$inc没有$set帮助,因为他们期望文字值。我也不认为findAndModify会有所帮助,因为它使用与update().

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

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

我建议将其分成两个查询。首先,通过sitetimestamp找到对象_id。您可以将返回的字段限制为column1column2。然后,发出具有相同条件的更新以及column1对and的匹配column2,并设置column3为它们的总和。如果在查找和更新查询之间更改了这些字段,则向更新条件添加column1和添加column2将确保您不会无意中存储无效。并且有效地,您的更新查询变得idempotent

于 2012-06-26T19:47:34.603 回答