MongoDBツリーストレージ

mysqlにツリーを保存するためのアルゴリズムはいくつかありますが、リレーショナルデータベースはこのために設計されていないため、これは根本的に間違っているように思われます。 特定のmongoDBでNoSQLを使用することについてどう考えましたか? それは簡単です、彼らは私にインタビューを求めました:

ツリーを構築する方法は?


私は答えた:

mongodbとそこからツリーのあるドキュメントを取り出します


彼らは私に電話をかけませんでしたが、私は今mongoDBを勉強していて、Mysqlが好きではないことに気を悪くしていません(残念ながら、または残念ながらわかりません)。 一般的に、それがすべてどのように機能するか見てみましょう? phpで記述されたコメントツリーの例。



コードをすぐに提供します。



//     mongodb     //       /** * @return \MongoDB\Driver\Manager * */ static function getConnect() { if(!is_null(self::$_connect)) { return self::$_connect; } self::$_connect = new \MongoDB\Driver\Manager(Config_Db::getConf()['mongodb']['connect']); return self::$_connect; } //   /** * add comment action */ public function addCommentAction() { $time = time(); //     //insert new comment to the page $arrData = array( 'page' => $_POST['page_id'], // id   mongo 'time' => $time, //    'name' => $_POST['name'], //   'comment' => $_POST['comment'] //   ); $connect = Core_Model_Mongo::getConnect(); //    //              //           $write = new MongoDB\Driver\BulkWrite(); $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY); //  ,     - ,     reply  id  if(isset($_POST['reply']) && !empty($_POST['reply'])) { // id  $reply = $_POST['reply']; //     //  ,        $path = ''; if(isset($_POST['path']) && !empty($_POST['path'])) { $path = $_POST['path']; } else { $path = 'replies'; } // ,     $write->update( array('_id' => new MongoDB\BSON\ObjectID($reply)), //   array('$push' => array($path => $arrData) ) //  push,   ,  path ); } else { $write->insert($arrData); //       } //   $connect->executeBulkWrite(Config_Db::getConf()['mongodb']['db'] . '.comments', $write, $writeConcern); //    header('Location:' . $_POST['back_url']); }
      
      





したがって、保存するパスはパス変数に渡されます。たとえば、mongoにコメントがあります。これを「クリーン」な配列と考えてください。実際には、これはオブジェクトの配列なので、すべてを配列に単純化します。



1つのコメント配列
  array ( 'name' => 'test', 'comment' => 'test comment', );
      
      







更新後、pushおよびpath = 'reply'変数を使用して、配列は次の形式になります。



プッシュ後の配列
  array ( 'name' => 'test', 'comment' => 'test comment', 'reply' => array ( [0] => array( 'name' => 'test reply test' 'comment' => 'test comment reply' ) ) );
      
      







添付されたコメントに応答すると、パスは「reply.0.reply」という形式になります。つまり、コメントの応答で、0要素を取得し、データを含む新しい応答フィールドを挿入します。操作の後、次の配列を取得します。



ネストされたコメントのレプリカを持つ配列
  array ( 'name' => 'test', 'comment' => 'test comment', 'reply' => array ( [0] => array( 'name' => 'test reply test' 'comment' => 'test comment reply' 'reply' => array ( [0] => array( 'name' => 'test reply test' 'comment' => 'test comment reply' ) ) ) ) );
      
      







そして、それがすべて、アルゴリズム全体です。単にこの配列を挿入して、そのままレンダリングするために使用します。 レンダリングはそれほど重要な部分ではないので、ペイントしません。もちろん、print_r()を使用して冗談として行いますが、原則は同じです。ご愛顧の皆様、ありがとうございます。



PS:例では、アルゴリズムが提示されており、それは仮定、すなわちコメントのソートの欠如とその永続性を持っています。



All Articles