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の後に並べ替えるとします。
私はいくつかのチュートリアルに従ってみましたが、それらのほとんどは非常に静的なドキュメントを扱っているので、これは私がこれを間違って行うかもしれないという考えを私に与えますか?
どんな助けや提案も大歓迎です。