2013-02-26 5 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

1

другой синтаксис, не слишком много фигурных скобок

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