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も役に立ちません。と同じ修飾子オブジェクトを使用するため、findAndModify$setも役立つとは思いません。update()

マップされているドキュメントを変更することを意図していないため、 map/reduce も適切ではないと思います。

シャード化されたインフラストラクチャを使用していない場合は、db.eval()を使用してオブジェクトをアトミックに取得および更新できます。ただし、それはオプションではありません。

これを 2 つのクエリに分割することをお勧めします。まず、sitetimestampおよびでオブジェクトを見つけます_idcolumn1およびに返されるフィールドを制限できますcolumn2次に、同じ条件に加えcolumn1てとで一致する更新を発行し、それらの合計column2に設定します。更新条件にとをcolumn3追加すると、検索クエリと更新クエリの間でこれらのフィールドが変更された場合に、誤って無効な値を格納することがなくなります。そして事実上、更新クエリはべき等になりますcolumn1column2

于 2012-06-26T19:47:34.603 に答える