2015-12-10 10 views
5

Abbiamo un oggetto con proprietà annidate che vogliamo rendere facilmente ricercabili. Questo è stato abbastanza semplice da raggiungere, ma vogliamo anche aggregare informazioni basate su più campi. In termini di dominio abbiamo più offerte che hanno gli stessi dettagli ad eccezione del venditore. Abbiamo bisogno di consolidarli come un unico risultato e mostrare le opzioni del venditore nella pagina seguente. Tuttavia, dobbiamo ancora essere in grado di filtrare in base al venditore nella pagina iniziale.RavenDB Map Reduce Distinct Index

Abbiamo tentato qualcosa di simile al seguente, per cercare di raccogliere più venditori su una riga ma contiene duplicati e la creazione dell'indice richiede per sempre.

Map = deals => deals.Select(deal => new 
{ 
    Id = deal.ProductId, 
    deal.ContractLength, 
    Provider = deal.Provider.Id, 
    Amount = deal.Amount 
}); 

Reduce = deals => deals.GroupBy(result => new 
{ 
    result.ProductId, 
    result.ContractLength, 
    result.Amount 
}).Select(result => new 
{ 
    result.Key.ProductId, 
    result.Key.ContractLength, 
    Provider = result.Select(x => x.Provider).Distinct(), 
    result.Key.Amount 
}); 

io non sono sicuro che questo il modo migliore per gestire questo problema, ma abbastanza nuovo per Raven e lottando per le idee. Se manteniamo l'indice semplice e il gruppo sul lato client, non possiamo mantenere costante il paging.

Qualche idea?

+0

'Provider = result.Select (x => x.Provider) .Distinct()' non puoi farlo. Map/Reduce è distribuito e nessun punto puoi presumere che * mai * abbia l'intera collezione di Provider. Gli unici operatori fidati di linq nella riduzione sono come 'Count()' e 'Sum()' perché sono associativi –

+0

So che questo è distribuito su piattaforme come Hadoop ma sei sicuro che questo sia effettivamente distribuito in RavenDB? –

+0

sì, non si può mai dipendere dall'avere il set di oggetti completo in riduci. Questo non vuol dire che non ce l'avrai, magari anche con il set completo il 99% delle volte, ma anche se l'1% delle volte non ti condurrai in un campo minato di dati fuorvianti. Eseguendo una selezione per '.Provider' nella riduzione del genere, stai assicurando che il tuo indice mancherà di dati. –

risposta

0

Si sta raggruppando sull'ID documento. deal.Id, quindi non genererai mai una riduzione su più documenti. Non penso che questo sia inteso.

+0

Scuse Ayende! Questa situazione è stata creata per errore quando stavo cercando di semplificare l'esempio per la pubblicazione. Ho aggiornato la domanda per riflettere il problema reale. Pensa all'Id come a un ID condiviso per le informazioni sui prodotti collegati. –