3

我对 MongoDB 和 Lithium 都是新手,我真的找不到处理嵌套文档的“好方法”。我注意到当我尝试

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

我为“somenewfield”得到的是一个 Document 对象。但是还有一个 DocumentArray 类——它们之间有什么区别?

当我打电话

$user->save(); 

这导致Mongo(如预期的那样):

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

好的,但是当我以后想向数组添加一个新的键值并尝试时

$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 回答