3

わかりました、私は次のことをする必要があります

私はmongoを次のように収集しています

array (
  '_id' => new MongoId("50513d8338fc5de706000000"),
  'offers' => 
  array (
    '0' => 
    array (
      'minspend' => '50.00',
      'cashback' => '1.50',
      'percentage' => '0.03',
    ),
    '1' => 
    array (
      'minspend' => '100.00',
      'cashback' => '3.00',
      'percentage' => '0.03',
    ),
  ),
  'percentageTotal' => '0.06',
  'test' => new MongoInt32(1),
)

しかし、この部分だけを更新したいとしましょう

array (
        '0' => 
        array (
          'minspend' => '50.00',
          'cashback' => '1.50',
          'percentage' => '0.03',
        ),

その配列内のデータのコレクション全体を再作成せずに、サブ配列のその部分を変更する最良の方法は何ですか?

そして、このようなことをすることは可能ですか

array (
        '0' => 
        array (
'Offer_id'=> new MongoId(5715671561715),
          'minspend' => '50.00',
          'cashback' => '1.50',
          'percentage' => '0.03',
        ),

)

4

1 に答える 1

4

$setドット表記と一緒に使用して、更新する配列の要素を指定できます。

$collection->update(
    array("_id" => new MongoId("50513d8338fc5de706000000")), 
    array("$set" => array("offers.0" => 
        array (
            'minspend' => '50.00',
            'cashback' => '1.50',
            'percentage' => '0.03',
        )
    ))
);

offers.0配列の 0 番目 (= 最初) の要素を参照します。2 番目のものを更新する場合はoffers.1、キーとして使用します。

2 番目の質問については、MongoId をサブドキュメントに追加することを想定しています。'Offer_id' => new MongoId(),minspend の前に追加するだけで、同じように行うことができます。これにより、新しい一意の MongoId が作成され、サブドキュメントに追加されます。代わりに既存の MongoId を追加する場合は、 を使用して、16 進数の 24 文字の長い文字列にnew MongoId("...")置き換えます。...

既に Offer_id があり、その ID に一致するオファーのみを変更したい場合は、位置 $ 構文を使用できます。

$collection->update(
    array("_id" => new MongoId("50513d8338fc5de706000000"),
          "offers.Offer_id" => new MongoId("5059637720dfeda164ec0fe7")), 

    array("$set" => array("offers.$" => 
        array (
            'minspend' => '50.00',
            'cashback' => '1.50',
            'percentage' => '0.03',
        )
    ))
); 

を使用して文書を照会し、_idさらに を照会しますoffers.Offer_id。コマンドの更新部分では、offers.$$ を使用すると、Offer_id を含む正しいサブドキュメントに自動的に一致します。

于 2012-09-18T05:35:41.667 に答える