PHP - MongoDB将数组移动到子数组

时间:2012-09-24 12:03:46

标签: php arrays mongodb

好的我正在使用MongoDB作为后端制作博客系统。我想在编辑时执行与wordpress相同的操作,保存过去的版本并允许您在需要时恢复它们。

我也想这样做。

我有几种方法可以做到这一点。但不确定这是否是最简单的方法,并希望得到一些建议。

第一个是查找和插入$ 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"}]
}

1 个答案:

答案 0 :(得分:0)

在您的示例中,即使您最多只希望使用一个文档,也会迭代MongoCursorMongoCollection::findOne()在这里会更合适,因为如果没有文档匹配,它将返回第一个结果的文档数组或null

即使你需要迭代多个结果,你最好利用MongoCursor的可迭代特性(它实现了Iterator,它扩展了Traversable,这意味着你可以在foreach循环中使用它)。我也不认为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