0

わかりました、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"}]
}
4

1 に答える 1

0

あなたの例では、MongoCursorを反復処理していますが、最大で 1 つのドキュメントのみを操作することを期待しています。MongoCollection::findOne()nullは、最初の結果のドキュメント配列を返すか、一致するドキュメントがない場合に、ここでより適切になります。

複数の結果を反復処理する必要がある場合でも、MongoCursor の反復可能な性質を利用することをお勧めします (Traversable を拡張する Iterator を実装しているため、foreachループで使用できます)。また、基本的に一時変数をここに格納するのにdefine()が適切だとは思いません。さらに、このコードを 2 回実行する必要がある (再定義によるエラー) か、タイトルまたはコンテンツがスカラーではなかった (別のエラー) とします。

次の書き直しを検討してください ($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'],
                ),
            ),
        )
    );
}

ここでの 1 つの逸脱は、不要かもしれませんが、古いバージョンをpast_versions配列に集約していることです。$push演算子を使用して、ドキュメントの配列フィールドに追加できます。$setまたは、最新バージョンのみを保存する必要がある/保存したい場合にのみ使用できます。

于 2012-09-24T19:33:35.327 に答える