2013-02-26 77 views
2

我的目標是使用mongodb 2.2和最新的c#驅動程序基於日期範圍執行匹配和分組。如何在Mongodb的聚合框架中構建日期範圍查詢?

我在使用日期時間的聚合框架中創建匹配查詢時遇到問題。我不知道我的數據類型是不正確的(poco有日期時間,對象是utc保存),或者如果查詢不正確,更可能。

//Here is the doc format that I'm querying: 

    { 
     "DateTime" : new Date("2/20/2013 17:29:03"), 
     "DateTimeString" : "20130220", 
     "PurchaseAmount" : 1.91, 
     "ProductId" : "51293ac844da932e941fa2c4", 
     "_id" : "20130220/51293ac844da932e941fa2c4" 
    } 

//這裏是聚集查詢我試圖

var timeStamp = DateTime.UtcNow.AddDays(-20); 
    var startDate = timeStamp.Date; 
    var endDate = timeStamp.AddDays(1).Date; 

var match = new BsonDocument 
       { 
        { 
         "$match", 
         new BsonDocument 
          { 
           { "ProductId" , "51293ac844da932e941fa2c4"} 
          } 
        } 
       }; 
      var match2 = new BsonDocument 
       { 
        { 
         "$match", 
         new BsonDocument 
          { 
      ***    { "$gte" , new BsonDocument{{"DateTime", timeStamp}} } //, 
      ***     // { "$lt" , endDate} 
          } 
        } 
       }; 

      var group = new BsonDocument 
       { 
        { "$group", 
         new BsonDocument 
          { 
           { "_id", new BsonDocument 
             { 
              { "ProductId" , "$ProductId"} 
              ,{ "DateTime" , "$DateTime" } 
             } 

           }, 
           { 
            "AvgOrder", new BsonDocument 
               { 
                { "$avg", "$PurchaseAmount" } 
               } 
           } 
          } 
        } 
       }; 

    var pipeline = new[] { match, match2, group }; 
      var aggregateResult = dbSession.GetCollection<RecentOrders>().Aggregate(pipeline); 

請參閱*。我想提供特定的時間範圍,並計算該時間段內該客戶的平均訂單(按分鐘,小時或日期範圍)。我相信除了日期範圍查詢部分(match2)之外,我可以使用它。我認爲這個問題是新的BsonDocuments和查詢的棘手組合。非常感謝,如果你能幫助!

回答

6

你有東西在match2換。它應該是這樣的,而不是:

var match2 = new BsonDocument 
    {{ "$match", new BsonDocument 
     {{ "DateTime", new BsonDocument { 
      {"$gte", timeStamp}, 
      {"$lt", endDate} 
     }}} 
    }}; 
+0

另一種語法非常感謝你。我看起來也很乾淨。 – user376456 2013-02-26 14:24:36

1

沒有太多的花括號

var match2 = new BsonDocument() 
    .Add("$match", 
     new BsonDocument().Add("TimeStamp", 
           new BsonDocument().Add("$gte", timestamp) 
                .Add("$lte", end)));