2012-05-29 3 views
0

Update 1, après la réponseCarte réduire à RavenDB

de Ayende Ceci est mon premier voyage dans RavenDB et d'expérimenter avec elle, j'ai écrit une petite carte/réduire, mais le résultat est malheureusement vide?

J'ai autour de 1,6 million de documents chargés dans RavenDB

Un document:

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

et voulait obtenir Min et Max de Ask sur une période de temps spécifique.

La collection par Time est défini comme:

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(); 

Ce qui me donne 90280 documents, à ce jour si bon.

Mais la carte/réduire:

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; } 

    } 

Je crée alors l'index et essayer de l'interroger:

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>(); 

Mais le groupe est juste vide :(

Comme vous pouvez J'ai essayé deux requêtes différentes, je ne suis pas sûr de la différence, quelqu'un peut-il expliquer?

Maintenant, je reçois une erreur:enter image description here

Le groupe sont encore vides :(

Laissez-moi vous expliquer ce que je suis en train d'accomplir dans sql pur:

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

Suite ici, http://stackoverflow.com/questions/10853783/map-reduce-in-ravendb-update-1 La réponse ci-dessous, qui a été étrangement récompensée car utile ne sera pas acceptée :) – Janus007

Répondre

1

Cette est pas comment vous travailler avec Map/réduire

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

Créez un index de réduction de carte qui incorpore l'heure en tant que partie du groupe par clé, puis vous pouvez effectuer une requête à ce sujet.

+0

Hi Ayende ... vient de mettre à jour ma question avec plus d'infos. – Janus007