2012-03-28 2 views
0

私は、ニュースレターの活動に関するレポートを生成するためにmapreduceを実行しています。私が使用して、特定のニュースレターにレポートを実行するにクエリに含まれるMongoDBのタイムアウト!==

var query = Query.And(
        Query.EQ("NewsletterId", BsonInt32.Create(newsletterId)), 
        Query.GTE("DateAdded", BsonDateTime.Create(startDate)).LTE(BsonDateTime.Create(endDate)) 
       ); 

私は今同じのMapReduceを使用して(ニュースレターのすべての電子メール・アクティビティの集計レポートを取得できるようにしたいが、ちょうど変更クエリ)。このために私が使用します。

var query = Query.And(
        Query.Where(new BsonJavaScript("this.NewsletterId !== null")), 
        Query.GTE("DateAdded", BsonDateTime.Create(startDate)).LTE(BsonDateTime.Create(endDate)) 
         ); 

は私が最初のクエリで使用されていると思うNewsletterIdとDateAddedを含み、インデックスセットを持っていますが、タイムアウトにそれを引き起こしているではない2つ目。

クエリがタイムアウトしないように最適化を行うことはできますか?

+0

これより小さいか等しいと、ほとんどすべての場合で同じではないよりもスキャンするレコードが少なくなります。最初のクエリはどのくらいの期間、結果を提供するのにかかるか、2番目のクエリのタイムアウトはどれくらいですか? –

答えて

1

代わりに$existsを使用してください。 (10gen C#ドライバのExists()

MongoDBでは、$whereは大きなコレクションでは遅くなります。本来インデックスを使用していません。各オブジェクトを逆シリアル化して、あなたの句を評価します。

完全性を期するために、日付範囲に比較的少数のドキュメントが含まれている場合は、$and句のコンポーネントの順序を切り替えるだけで十分に最適化できます。そうすれば、遅い操作をすべてのレコードで実行するのではなく、日付範囲のレコードに対して低速な操作を実行することになります。

+0

両方の提案を実装し、それは素晴らしい作品です。ありがとうございました! –

関連する問題