0

好的,我正在制作一个使用 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"}]
}
4

1 回答 1

0

在您的示例中,您正在迭代MongoCursor,即使您最多只希望使用一个文档。MongoCollection::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如果您只需要/想要存储最新版本,您可以简单地使用。

于 2012-09-24T19:33:35.327 回答