2

Mongoを試してみるために、MongoDBを使用してPHPで簡単なブログシステムを構築しようとしていますが、クエリを実行するのにいくつかの問題が発生しました。

2000のランダムな投稿を生成しました。各ブログ投稿ドキュメントは次のようになります。

{
   "_id": ObjectId("4f908868d3269edc1a00044c"),
   "author": {
     "name": "Christine Skinner",
     "email": "Phyllis_Kirkland@.info",
     "age": 54,
     "city": "London" 
  },
   "post": "sagittis. Nullam vitae diam. Proin dolor. Nulla semper tellus id nunc interdum feugiat. Sed nec metus facilisis lorem tristique aliquet. Phasellus fer [...]",
   "date": "Fri Nov 13 12: 11: 48 +0100 2009",
   "rating": 2,
   "comments": {
     "0": {
       "name": "Barrett Bailey",
       "email": "Velma_Morales@.org",
       "upVotes": 4,
       "downVotes": 76,
       "comment": "gravida. Aliquam tincidunt, nunc ac mattis ornare, lectus ante dictum mi, ac mattis velit justo nec ante. Maecenas mi felis, adipiscing fringilla, por [...]" 
    },
     "1": {
       "name": "Cheryl Fitzgerald",
       "email": "acqueline_Perkins@.org",
       "upVotes": 13,
       "downVotes": 76,
       "comment": "adipiscing. Mauris molestie pharetra nibh. Aliquam ornare, libero at auctor mauris id sapien. Cras dolor dolor, tempus non, lacinia at, iaculis quis, [...]" 
    },
     "2": {
       "name": "Carly Graham",
       "email": "Judah_Santana@.dk",
       "upVotes": 55,
       "downVotes": 75,
       "comment": "Nullam velit dui, semper et, lacinia vitae, massa lobortis ultrices. Vivamus rhoncus. Donec est. Nunc ullamcorper, velit in aliquet lobortis, nisi nib [...]" 
    } 
  },
   "tags": {
     "0": "World War II",
     "1": "world War I" 
  } 
}

たとえば、ある特定の著者によって書かれたすべての投稿を取得したり、評価がX以上の投稿を取得したりするときに、これらのより有利なクエリをほぼ把握していますが、コメントのネストされた配列に問題があります。

間違ったことをしたかどうかはわかりませんが、まずすべてのブログ投稿にコメントを付けて表示するにはどうすればよいですか?単純なことをしているときは$collection->find()、PHP関数iterator_to_arrayを使用してすべてを配列に入れます。次に、単純なforeach()を実行して各値を反復処理しますが、コメント自体は配列です。コメントを取得するために新しいforeachを作成する必要がありますか、それともこれを行うためのより高速でスマートな方法がありますか?

私が抱えているもう1つの問題は、クエリでコメントプロパティを使用するかどうかです。コメントを削除する場合は、_idとコメントの作成者(またはコメント番号)をブログに投稿する必要がありますが、コメントの数はさまざまであるため、コメントが1つしかない場合もあれば、最大10個のコメントがある場合もあります。

コメントを別のコレクションに入れる必要がありますか、それとも各コメントに配列番号だけでなく、より一意のIDを与えるように取得できますか?また、コメント内のプロパティをクエリに使用するにはどうすればよいですか。たとえば、1つのブログ投稿を表示したいが、コメントを最大のupVotesの後に並べ替えるとします。

私はいくつかのチュートリアルに従ってみましたが、それらのほとんどは非常に静的なドキュメントを扱っているので、これは私がこれを間違って行うかもしれないという考えを私に与えますか?

どんな助けや提案も大歓迎です。

4

2 に答える 2

4

まず、すべてのコメントを含むブログ投稿を取得したい場合は、次のようにすることができます。

$collection->find(array('author.name'=>'Christine Skinner'));

次に、はい、すべてのコメントを表示する場合は、別のループが必要です。

foreach ($cursor as $post){
   foreach($post['comments'] as $num=>$comment){
      echo "Comment number "
           .$num
           ." was written by "
           .$comment['name']
           .": " 
           .$comment['comment'];
   }
}

ドキュメントの個々のコメントを更新する場合は、次のように行うことができます。

   $collection->update(
      array('_id'=>new MongoId($id)), 
      array('$set'=>array('comments.'.$num.'.comment'=>$newComment))
);

クエリ内のコメントサブドキュメントを並べ替えることはできないため、クエリを実行した後、返される投稿ごとにPHP内で並べ替える必要があります。PHPマニュアルのusortを見てください。これは、必要なことを実行する可能性があります:http ://www.php.net/manual/en/function.usort.php 。

于 2012-04-23T18:51:07.000 に答える
0

ドキュメントによると、実際には配列ではなくサブドキュメント(オブジェクト)にコメントを格納しています。したがって、基本的に、各コメントには一意のID(この場合は0〜2)があります。特定のコメントを削除したい場合は、コンソールで次のように簡単になります。

db.collection.update({"_id": ObjectId("4f908868d3269edc1a00044c")}, {$unset: {"comments.1": 1}});

またはPHPの場合:

$collection->update(array("$unset" => array("comments.1" => 1)));

あなたのコメントを繰り返すことに関しては、あなたはそれを正しく持っています。基本的に、返されたドキュメントのコメント要素を確認する必要があります。

于 2012-04-23T18:48:04.220 に答える