2012-07-19 6 views
3

저는 MongoDB와 Lithium을 처음 접했고 중첩 된 문서를 다루는 "좋은 방법"을 찾을 수 없습니다. 나는Lithium 및 MongoDB에서 중첩 된 문서/배열로 작업하기

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

을하려고 할 때 제가 "somenewfield"얻을 것은 문서 객체입니다 것으로 나타났습니다. 그러나 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 

리튬을 사용하는 문서에 새 배열을 추가하는 올바른 방법은 무엇입니까? 배열을 업데이트/배열에 새 값을 추가하는 올바른 방법은 무엇입니까? 배열 값을위한 키를 줄까?

미리 도움을 주셔서 감사합니다. 나는 다소 붙어있어 ... 문서를 읽고 코드를 읽었지 만 어떤 점에서는 혼자서 모든 것을 알아 내기가 어렵다. :)

편집 : 내가 결국 발견 한 것은 중첩 된 배열을 사용하여야하는 것은 $ 푸시와 $ 풀 함께 : 나는 하위 문서를 처리하는 몇 가지 단점이 있다고 생각

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

+0

누구든지이 문제가 다시 발생하면 리튬 테스트를 읽어보십시오! 리튬은 수백 가지가 있으며 프레임 워크에 대한 더 나은 이해를 돕습니다. – Chris