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?
toDateTime
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.
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
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