2012-09-24 2 views
0

좋아요. MongoDB를 백엔드로 사용하여 블로그 시스템을 만들고 있습니다. 나는 그것을 편집 할 때 이전 버전을 저장하고 필요할 경우 되돌릴 수 있도록 Wordpress와 동일한 작업을 수행하려고합니다.PHP - MongoDB 배열을 부분 배열로 이동

나는 이것을하고 싶다.

몇 가지 방법이 있습니다. 그러나 이것이 최선의 쉬운 방법인지와 몇 가지 제안을하고 싶지 않은지 확실하지 않습니다.

첫 번째

<?php 
$cursor = $collection->find(array("_id"=> new MongoId($data))); 

     if ($cursor->count() > 0) 
     { 
       while($cursor->hasNext()) { 
       foreach($cursor->getNext() as $key => $value) 
       { 
        define("_".strtoupper($key), $value); 
       } 

       } 

$cursor = $collection->update(array("_id" => new MongoId($data)), 
'$set'=>array("title"=>$data['TITLE'], "content"=>$data['content'], "past_versons"=>array("title" => _TITLE, "content" => _CONTENT))); 
     } 
?> 

그래서 내 질문에 내가 그것을 할 것이라고이 방법입니다 발견 및 삽입 $의 SET입니다. 당신은 기껏해야 하나 개의 문서 작업을 기대에도 불구하고 여기에 샘플 JSON 당신의 예에서

{ 
"title":"blog title", 
"content":"blog content", 
"past_verson":[{"title":"blog title past","content":"past blog content"}] 
} 

답변

0

, 당신은 MongoCursor 반복하고 있습니다. MongoCollection::findOne()은 첫 번째 결과의 문서 배열을 반환하거나 일치하는 문서가없는 경우 null을 반환하므로 여기에서 더 적합 할 것입니다.

여러 결과를 반복 할 필요가있는 경우에도 MongoCursor의 반복 가능한 특성을 활용하는 것이 좋습니다 (반복 가능을 확장하는 Iterator를 구현하므로 foreach 루프에서 사용할 수 있음). 나는 또한 define()이 본질적으로 임시 변수 인 것을 저장하는 데 적절하지 않다고 생각합니다. 또한이 코드를 두 번 (재정의로 ​​인한 오류) 실행해야하거나 제목 또는 내용이 스칼라가 아닌 경우 (다른 오류)라고 가정합니다. ,

$document = $collection->findOne(array('_id' => new MongoId($data['id']))); 

if (null !== $document) { 
    $collection->update(
     array('_id' => new MongoId($data['id'])), 
     array(
      '$set' => array(
       'title' => $data['title'], 
       'content' => $data['content'], 
      ), 
      '$push' => array(
       'past_versions' => array(
        'title' => $document['title'], 
        'content' => $document['content'], 
       ), 
      ), 
     ) 
    ); 
} 

한 편차를 여기, 당신이 필요하지 않을 수있는된다

는 다음 다시 쓰기 (나는 $data['id']가 올바로 작동하고 사용자가 MongoId 혼자 $data를 사용하여 위의 코드에 오타가 가정) 고려 이전 버전을 past_versions 배열로 집계한다고 가정합니다. $push 연산자를 사용하여 문서의 배열 필드에 추가 할 수 있습니다. 또는 가장 최신 버전 만 저장하거나 필요로하는 경우 간단하게 $set을 사용할 수 있습니다. 나는이 '$ 푸시'=> 배열 ( 'past_versions'=> 배열 ( $ 문서, ), )에 $ 푸시 부분을 변경하는 경우

+0

그 덕분 들면, 는 모든 것을 저장 것이라고 $ document 영역에 있었다. – RussellHarrower

+0

예, 배열 값을'past_versions' 배열로 푸시합니다. – jmikola

관련 문제