1

彼/彼女がフォローしている他のユーザー ID の配列を持つUserエンティティがあります。

var userSchema = {
  following: { type: Array }
};

私は RESTful API を持っています。私が をリクエストするときUser、私のアプリケーションはそれが何人のフォロワーをUser持っているかを知る必要があります。

私が見る2つのオプションは次のとおりです。

  • Userが要求されたら、次のようなカウント クエリを実行します。{ following: { $in: [userId] } }
  • aUserPOST編集されたら、ユーザー ID が配列に追加または削除されたかどうかを確認し、追加または削除されたfollowing場合は、MongoDB を使用して、フォロー/フォロー解除されたドキュメントのプロパティ$incをインクリメントまたはデクリメントします。followersCountUser

他に選択肢はありますか?そうでない場合、最良の選択肢は何ですか?ドキュメント自体にプロパティを配置するのは少し奇妙に感じfollowersCountます。これは、実際には動的なカウントであるにもかかわらず、アプリケーションによって更新できることを示唆しているためです。

articleに関連付けられているの数を返すために RESTful API が必要な同様の状況がありますwebsite。要求に応じてその Web サイトの記事をカウントしますか? それともカウント プロパティを保存し、その Web サイトに関連付けられた新しい記事が作成されるたびにそれを更新しますか?

4

2 に答える 2

0

あなたがやりたい方法が正しい方法です。MongoDB のようなものの利点の 1 つは、ページで実行する必要があるクエリを減らすためにデータを埋め込むことができることです。これは、フォロワー数をキャッシュすることによって行っていることです。

両方のオプションが機能します。それは、作成したいトレードオフに関するものです。

1) 効率は劣りますが、最も正確です。どういうわけか発生するあらゆる種類の非同期は、次に誰かをフォローするときに修正されます。これは、フォロワー数が増えたり、ユーザー データベースが大きくなったりした場合に、最初から変更するのに適切な方法です。

2) 最も効率的です。フォロワー数を変更するときは常に $inc を呼び出す必要があります。そうしないと、#1 を実行するまで非同期になります。

別の方法として、#2 を実行してからバックグラウンドで調整ジョブを実行することもできます。これにより、オフハンドの機会に再同期されます。これはMongoDB 集計フレームワークを使用して簡単に実行できます。コレクション内のタイムスタンプを使用しUser、最後にジョブが実行されてから更新されたフォロワーのみを再計算することで、調整ジョブを高速化できます。

元の質問が更新されたときに展開するには:

一般に、 を避けることができるのであれば、そうcount()するべきです。

count()使用を開始してから、後でより効率的なソリューション (#2) に切り替えることには何の問題もありません。memcache のような場所に結果をキャッシュするcount()ことも、直接使用をやめるまでパフォーマンスの問題を軽減するために使用できますcount()

于 2013-05-14T23:09:20.220 に答える
0

ドキュメントに必要だと思うよりも多くのデータを保存することを恐れないでください。RDMS ではなく、mongo の方針に沿って考え始めたとき、すべてを正規化するという考えから解放されました。厳密には必要ない場合でも、ドキュメントに「役立つ」情報を追加することができました。ドキュメント内のトランザクションは安価であり、ストレージのコストも比較的安価です。別のドキュメントまたはコレクション内の情報を見つけるコストは (処理に関して) 高価であり、可能であれば軽減する価値があります。

「アプリケーションが編集できる」データベースにカウントがあることについての懸念を理解しています。だから何?アプリケーションがそれを編集できないことを確認し、API が世界中に公開されている場合は、それらも編集できないことを確認してください。「キャッシュされた」カウントの有用性は、編集されて同期が取れなくなる可能性があるという事実よりもはるかに重要です。これは、nosql データベースを使用する危険性の 1 つです。データベースに依存するのではなく、アプリケーション コードがデータを適切な順序で維持することを信頼しているため、物事が同期しなくなる可能性があります。

このことを考慮。ユーザーが削除され、カウントが更新されない場合はどうなりますか。それはユーザーにとって世界に違いをもたらすでしょうか? おそらくそうではありません。値をチェックするバックグラウンド タスクのアイデアは気に入っていますが (そのようなものを用意する価値はあります)、別の解決策は、ユーザーがフォロワーに何かを投稿するたびに整合性をチェックすることです。その場合、とにかくすべてのユーザーを取得する必要があるため、カウントも比較的安価に確認できます。基本的に、ユーザーからメッセージが送信されるたびにデータの整合性をチェックするフェイルセーフを構築しています。ユーザーが送信しない場合、そのユーザーはカウントが 100% 正確であるかどうか気にしない可能性があります。

結局のところ、コードが十分にテストされ、防御的なコーディング プラクティスに従っていれば、一貫性の問題は発生しないはずです。

于 2013-06-17T14:25:06.000 に答える