通常のブログ エンジンを想像してみましょう (ほんの一例です)。モデルは、コメント「コレクション」が埋め込まれた Posts コレクションで構成されます。
ここで、Post データと一緒に最近のコメントを 10 件だけ取得する必要があります。
- これを行う最善の方法は何ですか?
- これは価値のある最適化ですか? (ネットワークトラフィックの削減は別として)
PS 私は公式の C# ドライバー + fluent-mongo を使用していますが、正当な理由で linq をあきらめることができます。
通常のブログ エンジンを想像してみましょう (ほんの一例です)。モデルは、コメント「コレクション」が埋め込まれた Posts コレクションで構成されます。
ここで、Post データと一緒に最近のコメントを 10 件だけ取得する必要があります。
PS 私は公式の C# ドライバー + fluent-mongo を使用していますが、正当な理由で linq をあきらめることができます。
配列のサブセット (最後の 10 個) を取得するために Slice コマンドを使用できませんでしたか? 何かのようなもの:
db.posts.find({}, {comments:{$slice: -10}})
同様のことをしなければならなかったときに、公式ドキュメントでこれを見つけました。
C# で slice コマンドを使用する最も簡単な方法は次のとおりです。
var your_query;
var slice = Fields.Slice("comments", -10);
var cursor = collection.Find(your_query).SetFields(slice);
foreach (var document in cursor) {
...
}
最新のコメントの専用コレクションを使用してみませんか? コメントが投稿されたときに 2 つの挿入を実行する必要がありますが、最新のコメントを取得するのは簡単です。通常、新しいコメントが投稿されるよりもはるかに頻繁にこれらをフェッチします。
Steve B が指摘したように、これは通常、このコレクションには投稿コレクション内のコメントとはわずかに異なる情報が含まれている可能性があるという意味で「ビュー」です。たとえば、対応するリンクを表示できるように、各コメントに投稿 ID と投稿名を保存することができます。
古いコメントを自動的に削除する (つまり、FIFO を実装する) 100 個の要素など、上限のあるコレクションを使用できます。