2012-09-24 24 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