6

私は2つのコレクションを持っているmongodbデータベースを持っています。postsusers

投稿のjson構造は次のようになります

{title:"Title", content:"content goes here", postedby: "userid"}

そしてユーザーは

{username:"", name:""}

ここで、ユーザーが投稿を気に入るような機能を実装する必要があります。

解決策 1

次のようなユーザーに内部配列を配置できます

{username:"", name:"", likes:[postid1,postid2..]}

ここでの問題は、ユーザーが気に入った投稿を簡単にクエリできることです。しかし、記事を気に入った人を獲得するのは困難です。

解決策 2

次のような投稿に内部配列を配置できます

{title:"Title", content:"content goes here", postedby: "userid", like:[userid1,userid2 ..]}

ここでの問題は、記事を気に入った人を簡単に獲得できることです。しかし、ユーザーが気に入った投稿をクエリするのは困難です。

どうすればこれに取り組むことができますか? 現在、私は両方の方法を持つことを考えています。両方のコレクションに内部配列を保持するのと同じです。冗長なデータを保持していることはわかっていますが、この問題に取り組む最善の方法はありますか?

4

3 に答える 3

5

自問すべき重要な質問は、このデータを取得するために必要なさまざまな方法は何かということです。

最初のケースでは特定のページを気に入ったユーザーを、2 番目のケースでは逆のクエリでユーザーにクエリを実行できます。user.find({"likes":postId})しかし、それは良い考えですか?MongoDB でドキュメントが増え続けることは避けたいと思います。また、特定のユーザーが好きなすべてのページや、特定のページが好きなすべてのユーザーを知りたくないでしょう。

では、いいね! を独自のコレクションに保存し、集計 (カウント) のみをユーザー コレクションとページ コレクションに保持するのはどうでしょうか? また、ページ内の最新の "N" 個のいいね! を保持するオプションや、アプリケーションとそのパフォーマンスにとって最も有用なものを保持するオプションもあります。

ユースケース (つまり、パターンの読み取りと書き込み) とその周辺の要件を知らずに、MongoDB で「理想的な」スキーマを設計することはほとんど不可能です。

于 2013-02-04T20:19:37.140 に答える