2012-05-29 3 views
0

Update 1 после ответа Ayende вКарта уменьшить в RavenDb

Это мое первое путешествие в RavenDb и экспериментировать с ним я написал небольшую карту/уменьшить, но, к сожалению, результат пуст?

У меня есть около 1,6 миллиона документов, загруженных в RavenDb

документ:

public class Tick 
{ 
    public DateTime Time; 
    public decimal Ask; 
    public decimal Bid; 
    public double AskVolume; 
    public double BidVolume; 
} 

и хотел бы получить минимум и максимум Спросите через определенный период времени.

Коллекция по времени определяется как:

var ticks = session.Query<Tick>().Where(x => x.Time > new DateTime(2012, 4, 23) && x.Time < new DateTime(2012, 4, 24, 00, 0, 0)).ToList(); 

Который дает мне 90280 документы, до сих пор так хорошо.

Но тогда отображение/уменьшить:

Map = rows => from row in rows 
          select new 
          { 
           Max = row.Bid, 
           Min = row.Bid, 
           Time = row.Time, 
           Count = 1 
          }; 

Reduce = results => from result in results 
           group result by new{ result.MaxBid, result.Count} into g 
           select new 
           { 
            Max = g.Key.MaxBid, 
            Min = g.Min(x => x.MaxBid), 
            Time = g.Key.Time, 
            Count = g.Sum(x => x.Count) 

           }; 

...

private class TickAggregationResult 
{ 
    public decimal MaxBid { get; set; } 
     public decimal MinBid { get; set; } 
     public int Count { get; set; } 

    } 

затем создать индекс и попытаться его Query:

Raven.Client.Indexes.IndexCreation.CreateIndexes(typeof(TickAggregation).Assembly, documentStore); 


     var session = documentStore.OpenSession(); 

     var g1 = session.Query<TickAggregationResult>(typeof(TickAggregation).Name); 


     var group = session.Query<Tick, TickAggregation>() 
         .Where(x => x.Time > new DateTime(2012, 4, 23) && 
            x.Time < new DateTime(2012, 4, 24, 00, 0, 0) 
           ) 
      .Customize(x => x.WaitForNonStaleResults()) 
              .AsProjection<TickAggregationResult>(); 

Но группа просто пусто: (

Как вы можете e Я пробовал два разных запроса, я не уверен в различиях, может кто-нибудь объяснить?

Сейчас я получаю сообщение об ошибке:enter image description here

группа все еще пусто :(

Позвольте мне объяснить, что я пытаюсь сделать в чистом SQL:

select min(Ask), count(*) as TickCount from Ticks 
where Time between '2012-04-23' and '2012-04-24) 
+0

Продолжение здесь, http://stackoverflow.com/questions/10853783/map-reduce-in-ravendb-update-1 Ответ ниже, который, как ни странно, был вознагражден как полезный, не будет принят :) – Janus007

ответ

1

Этот не так, как вы будете работать с Карта/уменьшение

from row in rows where row.Time > new DateTime(2012, 4, 23) && row.Time < new DateTime(2012, 4, 24, 00, 0, 0) 

Создайте индекс сокращения карты, который включает время как часть группы по ключу, и вы можете запросить об этом.

+0

Hi Ayende ... просто обновил мой вопрос с дополнительной информацией. – Janus007