2013-08-22 3 views
0

저는 C# MongoDB 드라이버를 처음 사용했으며 날짜 범위에서 개체를 필터링하는 것에 대해 질문이 있습니다.날짜 범위의 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와 보관 가능합니까?()? 다른 검색어로 묶고 싶기 때문에 :

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

다른 방법이 있습니까?

답변

0

$where (docs) 연산자를 사용하지 않으면 일반적인 find 호출을 사용할 때 두 필드의 값을 비교하는 등의 데이터 작업을 수행 할 수 없습니다. $where을 사용하려는 경우 MongoDb는 $where 작업의 필드에 대한 인덱스를 이용할 수 없습니다. 또한 JavaScript 엔진을 사용하여 코드를 실행해야 성능에 더 많은 영향을 미칩니다.

당신이 MongoDB를 2.4 이상을 사용하는 가정 이상 :

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

그러나, 오히려 실적이 저조한 $where 연산자를 사용하는 것보다, 당신이거야 쿼리를 대상으로 필드를 포함하는 데이터 모델을 변경하는 것을 고려하는 것이 가장 좋습니다 일반적으로 필요합니다. 따라서 날짜 차이 값이있는 필드를 추가 할 수 있습니다.

집계 프레임 워크를 사용하여이 쿼리를 작성할 수는 있지만 일반적으로 일반적인 쿼리에 적합한 솔루션이 아니며 현재 큰 결과 집합과 문서 (즉 이름)를 반환하도록 처리되지 않습니다. 예를 들어 Here$subtract을 사용하는 예입니다.