2011-08-31 19 views
1

通常のブログエンジンを想像してみましょう。このモデルは、コメント「コレクション」が埋め込まれた投稿コレクションで構成されます。MongoDbはフィルタリング/オーダーを使って埋め込みコレクションをクエリしています

今、自分の投稿データとともに最新の10件のコメントを取得する必要があります。

  1. これを行う最善の方法は何ですか?
  2. これは貴重な最適化ですか? (ネットワークトラフィックの削減は別として)

P.S.私は公式のC#ドライバ+流暢なmongoを使用しますが、私は良い理由のためにlinqをあきらめることができます。

+0

ない答えが、あなたはCQRSパターンを見てとることができ...あなたの場合は、recentsコメントのビューを非正規化するべきです。 [Ncqrs framework](http://ncqrs.org/)は良いスタートポイントになるかもしれない –

+0

@Steve:そのリンクは私のためには役に立たない:( – mnemosyn

+0

ありがとう、スティーブ。私はCQRSを知っている。それはこのプロジェクトでは、しかし、別の "非正規化"ストレージなしで、私はすべてのmongodbを使用します。私の質問は明らかにクエリの部分に関連している、私はビューのために必要なデータだけをクエリする高速な方法が必要です。別のサブセットと完全なコレクションまたは個別のコレクションを表示するだけのデータはありますか?これは私が行うことはできますが、おそらく別の方法です。 – Kostassoid

答えて

2

あなたは、配列のサブセットを取得するためのスライスコマンドを使用することができませんでした(最後の10 )? 何かのように:私は似た何かをしなければならなかったとき

db.posts.find({}, {comments:{$slice: -10}}) 

私は公式ドキュメントでこれを見つけました。

リンク:私はC#のでスライスコマンドを使用することを見つけることができるhttp://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements

最も簡単な方法は次のとおりです。直接

var your_query; 
var slice = Fields.Slice("comments", -10); 
var cursor = collection.Find(your_query).SetFields(slice); 
foreach (var document in cursor) { 
    ... 
} 
+0

、ありがとう。実際には私が探していたものではありませんでしたが、実際には場合によっては良い解決策でした。今、私は10genが私が必要としているもの、AFAIKというバーチャルコレクションに取り組んでいることを知っています。 – Kostassoid

0

専用の最新コレクションを使用してみませんか?コメントが投稿されたときに2つの挿入を実行する必要がありますが、最新のコメントを取得するのは簡単です。通常、新しいコメントが投稿されるよりもずっと頻繁にこれらを取得します。

スティーブBが指摘したように、このコレクションはポストコレクション内のコメントとはわずかに異なる情報を含むかもしれないという意味で、通常は「ビュー」です。たとえば、投稿IDと投稿名を各コメントに保存して、対応するリンクを表示することができます。

あなたはcapped collection自動的に古いコメントが下がる100個の要素、言う、の使用することができ(すなわち、FIFOを実装)

+0

はい、私はキャップ付きのコレクションについて知っています、私はブログ全体の最新のコメントが必要な場合は良い解決策になるだろうが、私は各投稿の最新が必要です。私の場合、 "投稿数"が1000000を超えていたり、カウントされていたりしています。私は、キャップ付きのコレクションのサイズを計算する方法を知らないでしょう。専用のコレクションを使用するのは良い解決策のように見えますが、動的に設定されたフィルタを使用してデータを照会する方法があるのか​​どうか不思議でした。興味深いことに – Kostassoid

関連する問題