0

私は C# MongoDB ドライバーが初めてで、日付範囲でオブジェクトをフィルタリングすることについて質問があります。

私のコレクションには、次のようにフォーマットされたエントリがたくさんあります

{ 
   "_id" : ObjectId("51fa6ab684cc97132cfa4616"), 
   "startDate" : ISODate("2013-07-16T00:00:00Z"),
   "endDate" : ISODate("2013-07-26T00:00:00Z"),
   "company" : "ABC"
   "amount" : 15
}

("endDate" - "startDate") < 10 に基づいてコレクションをフィルター処理するクエリを作成します。これは、結果オブジェクトの終了日が開始日の 10 日未満である必要があることを意味します。

MongoDB.Driver.Builders.Query クラスを使用しようとしましたが、運がありませんでした。MongoDB.Driver.Builders.Query.Where() でアーカイブできますか? 次のような他のクエリと連鎖したいからです。

var amountQuery = Query.GT("amount", 10).LT(20);
var dateRangeQuery = // Query.XXX()....
var query = Query.And(amountQuery, dateRangeQuery );
var result = collection.Find(query);

または、他のアプローチはありますか?

4

1 に答える 1

0

$where( docs ) 演算子を使用しないと、従来のfind呼び出しを使用して 2 つのフィールドの値を比較するなど、データに対して操作を実行できません。を使用した場合$where、MongoDb は$where操作でフィールドのインデックスを利用できません。さらに、JavaScript エンジンを使用してコードを実行する必要があるため、パフォーマンスにさらに影響します。

MongoDb 2.4 以降を使用していると仮定します。

var dateRangeQuery=Query.Where(
             new BsonJavaScript("this.endDate - this.startDate < 10"))

ただし、パフォーマンスの低い$where演算子を使用するのではなく、データ モデルを変更して、一般的に必要なクエリを対象とするフィールドを含めることを検討することをお勧めします。そのため、日付の差の値を含むフィールドを追加することをお勧めします。

集計フレームワークを使用してこのクエリを作成することは可能ですが、一般的なクエリには適切なソリューションではないことが多く、現在、大きな結果セットとドキュメントを返すように設計されていません (したがって、名前が付けられています)。たとえば、 を使用した例を次に示します$subtract

于 2013-08-22T11:07:47.293 に答える