2013-08-22 30 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 
} 

我想根據編寫一個查詢過濾收集:(「結束日期」 - 「的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); 

或者還有其他方法嗎?

回答

0

如果不使用$wheredocs)運算符,則無法對數據執行操作,例如使用傳統的find調用時比較兩個字段的值。如果您要使用$where,則MongoDb無法利用$where操作中字段的索引。此外,它需要使用JavaScript引擎來執行代碼,這進一步影響了性能。

假設你正在使用的MongoDB 2.4或更高版本:

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

但是,而不是使用性能較差的$where運營商來說,最好考慮改變你的數據模型,包括目標,你將查詢的字段通常需要。因此,您可能需要添加一個字段,其中包含日期差異的值。

可以使用聚合框架構建此查詢,但它通常不是常見查詢的正確解決方案,並且當前不適用於處理返回的大型結果集和文檔(因此名稱)。例如,Here是一個使用$subtract的示例。