2012-07-19 79 views
3

我對MongoDB和Lithium都是新手,我無法真正找到使用嵌套文檔的「好方法」。我注意到,當我嘗試在Lithium和MongoDB中使用嵌套文檔/數組

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

我得到的「somenewfield」是一個Document對象。但也有一個DocumentArray類 - 它們之間有什麼區別?

當我打電話

$user->save(); 

這導致蒙戈(預期):

"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 

什麼是正確的方式來添加新的陣列使用鋰文檔?更新數組/向數組添加新值的正確方法是什麼?我應該爲alywas給出數組值的鍵嗎?

感謝您的幫助提前。我有點卡住...閱讀文檔,閱讀代碼...但在某些點很難找出所有的東西:)

編輯: 我在最後發現的是,我的方式應使用嵌套的數組是$推和拉$:

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

回答

1

我認爲有在處理子文檔一些怪癖,你可以嘗試:

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

或者用替代語法:

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

您應該能夠在測試中找到更多示例(查看任何文檔測試的測試/數據)。

+0

偉大的發現在替代語法,更乾淨。 – Tom 2013-02-04 07:31:08

+0

如果有其他人回來,請閱讀鋰電測試!鋰有數百個,他們將幫助你更好地理解框架。 – Chris 2013-02-05 05:22:52