2011-08-31 6 views
4

J'ai un indice un peu complexe que j'ai besoin sur un document RavenDBindex RavenDB avec carte réduire distincts

donné cette définition du document comme:

public class PriceDocument 
{ 
    public string Id { get; set; } 
    public Guid PriceId { get; set; } 
    public decimal Price { get; set; } 
    public DateTime? PricingDate { get; set; } 
    public string Source { get; set; } 
    public int Version { get; set; }  
} 

Je dois obtenir tous les produits pour une donnée productId (je peux le faire quand je requête) qui sont uniques par PricingDate (dernier) et Source

donc, étant donné les données suivantes:

var priceDocument = new PriceDocument { 
    Price = 1m, 
    Id = productId + "/1", 
    PricingDate = new DateTime(2011, 4, 1, 8, 0, 0), 
    PriceId = productId, 
    Source = "Bloomberg", 
    Version = 1 
}; 

var priceDocument1 = new PriceDocument { 
    Price = 1m, 
    Id = productId + "/2", 
    PricingDate = new DateTime(2011, 4, 1,9,0,0), 
    PriceId = productId, 
    Source = "Bloomberg", 
    Version = 1 
}; 

Je devrais obtenir à la suite priceDocument1, depuis son dernier.

Jusqu'à présent, j'ai un index défini comme ceci:

Map = docs => 
    from priceDocument in docs 
    select new { 
     PricingDate = priceDocument.PricingDate, 
     PricingSource = priceDocument.Source, 
     Price = priceDocument.Price, 
     PriceId = priceDocument.PriceId 
    }; 

Reduce = results => 
    from result in results 
    group result by new { result.PricingDate, result.Source } into price 
    select new { 
     PricingDate = price.Max(p => price.Key.PricingDate), 
     PricingSource = price.Key.Source, 
    }; 

Mais cela ne fonctionne pas au moment de l'exécution, je reçois un AbstractIndexingExecuter||8||Failed to index documents for index (my index name)

J'ai recréé cet échantillon dans un projet distinct et Je peux voir cela dans les statistiques dans Raven Studio que j'obtiens l'erreur:

Cannot implicitly convert type 'System.DateTimeOffset' to 'int' changed the DateTime? to DateTime

Et pas de chance.

je suis passé d'utiliser la date d'utiliser le je peux compter sur elle incrémenter maintenant l'indice ressemble à ceci:

Map = docs => 
    from priceDocument in docs 
    select new { 
     PricingDate = priceDocument.PricingDate, 
     PricingSource = priceDocument.Source, 
     ProductId = priceDocument.ProductId, 
     ProductVersion = priceDocument.Version 
    }; 

Reduce = results => 
    from result in results 
    group result by new { 
     result.PriceId, 
     result.PricingDate, 
     result.Source, 
     result.Version 
    } into price 
    select new { 
     PricingDate = price.Key.PricingDate, 
     PricingSource = price.Key, 
     ProductVersion = price.Max(p=> price.Key.Version) 
    }; 

Maintenant que renvoie pas d'erreur, mais il donne également aucun résultat.

Répondre

5

Il devrait probablement ceci:

PricingDate = price.Max(p => (DateTimeOffset)price.Key.PricingDate) 

Mais ce que vous voulez doesn Pas besoin d'un index de réduction de carte. Vous pouvez obtenir qu'en utilisant simplement:

session.Query<PriceDocument>() 
     .Where(x=>x.ProduceId == prodId) 
     .OrderByDescending(x=>x.PriceDate) 
     .FirstOrDefault(); 

La raison pour laquelle votre carte/Réduire l'indice ne fonctionne pas est que vous avez différentes sorties pour la carte & réduire les fonctions.

+0

Salut Ayende: Merci pour la réponse, le fait est qu'il doit être unique par PriceDate et par PricingSource (ie je peux avoir 2 lignes avec le même date tant que la source est différente) et sélectionnez celui où la version (ou la date) est la plus élevée – roundcrisis

+0

Cela n'a pas été la réponse complète, @ayende a répondu à la question dans le groupe de discussion corbeau https://groups.google. com/d/topic/ravendb/B9HCmi32YWw/discussion et la solution est ici https://gist.github.com/1186051 – roundcrisis

3

Essayant La modification de cette ligne dans la partie Réduire de l'indice, de

PricingDate = price.Max(p => price.Key.PricingDate) 

à

PricingDate = price.Max(p => (int)price.Key.PricingDate) 
+0

Merci J'ai essayé et maintenant le résultat est sans erreur mais aucun résultat non plus – roundcrisis

Questions connexes