3

私はMongoDBとLithiumの両方に不慣れであり、ネストされたドキュメントを操作する「良い方法」を実際に見つけることができません。試してみると気づきました

$user = Users::find('first' ... );
$user->somenewfield = array('key' => 'val');

「somenewfield」で取得するのはDocumentオブジェクトです。しかし、DocumentArrayクラスもあります-それらの違いは何ですか?

電話すると

$user->save(); 

これにより、Mongoが生成されます(予想どおり)。

"somenewfield" : { 
 "key": "value" 
}

OKですが、後で新しいキー値を配列に追加して試してみたい場合

$user->somenewfield['newkey'] = 'newval';
var_dump($user->somenewfield->to('array')); // shows the old and the new key-value pairs
$user->save(); // does not work - the new pair is not added

リチウムを使用してドキュメントに新しいアレイを追加する正しい方法は何ですか?配列を更新する/配列に新しい値を追加する正しい方法は何ですか?配列値のキーを指定しますか?

よろしくお願いします。私はちょっと立ち往生しています...ドキュメントを読んだり、コードを読んだりしています...しかし、ある時点で、すべてを一人で見つけるのが難しくなります:)

編集:最後に私が見つけたのは、ネストされた配列を使用する方法は$pushと$pullを使用することです。

Users::update(array('$push' => array('games' => (string) $game->_id)), 
  array(
    '_id' => $this->user()->_id, 
    'games' => array('$ne' => (string) $game->_id)), 
  array('atomic' => false));
4

1 に答える 1

1

サブドキュメントの処理にはいくつかの癖があると思います。試すことができます:

$somenewfield = $user->somenewfield;
$somenewfield->newkey = newvalue;
$user->somenewfield = $somenewfield;
$user->save();

または別の構文:

$user->{'somenewfield.newkey'} = $newvalue;
$user->save();

テストでより多くの例を見つけることができるはずです(ドキュメントのテストでテスト/データを見てください)。

于 2012-07-30T12:24:54.733 に答える