好的我正在使用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"}]
}
答案 0 :(得分: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
。