2012-09-24 79 views
0

好吧我正在製作一個使用MongoDB作爲後端的博客系統。當你編輯它時,我想要做和WordPress一樣的事情,保存過去的版本,並且如果需要的話可以讓你恢復它們。PHP - MongoDB將數組移動到子數組

我想這樣做。

我有幾種方法來做到這一點。但不知道這是否是最簡單的方法,並希望得到一些建議。

第一是查找和插入$ SET

<?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))); 
     } 
?> 

所以我的問題是這樣的我會做到這一點。

這裏的樣本JSON

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

回答

0

在你的榜樣,你遍歷一個MongoCursor即使你只希望至多有一個文檔工作。 MongoCollection::findOne()在這裏會更合適,因爲它將返回第一個結果的文檔數組,或者如果沒有文檔匹配,則返回null。即使你需要迭代多個結果,你最好還是利用MongoCursor的迭代本質(它實現了Iterator,它擴展了Traversable,這意味着你可以在循環中使用它)。我也不認爲define()適合存儲這裏基本上是一個臨時變量。此外,假設此代碼需要運行兩次(由於重新定義而導致錯誤),或者標題或內容不是標量(另一個錯誤)。

考慮以下重寫(我假定$data['id']是正確的,你單獨使用$data爲MongoId做在上面的代碼一個錯字):

$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'], 
       ), 
      ), 
     ) 
    ); 
} 

一個偏差在這裏,你可能並不需要,是我將舊版本聚合到past_versions陣列中。我們可以使用$push運算符來附加到文檔中的數組字段。或者,如果您只需要/想要存儲最新版本,則可以簡單地使用$set。對於

+0

謝謝你,是,如果我改變$推動部這個 '$推'=>陣列( 'past_versions'=>陣列( $文件, ), ), 將其保存一切是在$文檔區域 – RussellHarrower

+0

是的,這會將數組值推送到'past_versions'數組。 – jmikola