2011-03-23 12 views
6

हमारे पास एक ऐसी साइट है जिसमें स्ट्रीमिंग वीडियो है और हम पिछले सप्ताह, महीने और वर्ष (रोलिंग विंडो) में सबसे ज्यादा देखे गए वीडियो की तीन रिपोर्ट प्रदर्शित करना चाहते हैं।कई क्षेत्रों द्वारा Ravendb मैप्रिड समूहिंग

हम एक दस्तावेज़ संग्रहीत ravendb हर बार एक वीडियो देखा है:

public class ViewedContent 
{ 
    public string Id { get; set; } 
    public int ProductId { get; set; } 
    public DateTime DateViewed { get; set; } 
} 

हम मुसीबत पता लगाना कैसे अनुक्रमित/mapreduces कि उन तीन रिपोर्ट जनरेट होगा सबसे अच्छा समर्थन परिभाषित करने के लिए कर रहे हैं।

हमने निम्नलिखित मानचित्र/कम करने की कोशिश की है। ,

var lastSevenDays = session.Query<ViewedContent, ViewedContentIndex>() 
       .Where(x => x.DateViewed > DateTime.UtcNow.Date.AddDays(-7)) 
       .GroupBy(x => x.ProductId) 
       .OrderBy(x => x.Count) 

यह वास्तव में संकलन नहीं करता है:

var lastSevenDays = session.Query<ViewedContent, ViewedContentIndex>() 
       .Where(x => x.DateViewed > DateTime.UtcNow.Date.AddDays(-7)); 

Error: "DateViewed is not indexed"

अंततः, हम जैसे कुछ क्वेरी करना चाहते हैं:

public class ViewedContentResult 
{ 
    public int ProductId { get; set; } 
    public DateTime DateViewed { get; set; } 
    public int Count { get; set; } 
} 

public class ViewedContentIndex : 
     AbstractIndexCreationTask<ViewedContent, ViewedContentResult> 
{ 
    public ViewedContentIndex() 
    { 
     Map = docs => from doc in docs 
         select new 
           { 
            doc.ProductId, 
            DateViewed = doc.DateViewed.Date, 
            Count = 1 
           }; 

     Reduce = results => from result in results 
          group result by result.DateViewed 
          into agg 
          select new 
             { 
              ProductId = agg.Key, 
              Count = agg.Sum(x => x.Count) 
             }; 
    } 
} 

लेकिन, इस क्वेरी एक त्रुटि फेंकता ऑर्डरबी गलत है; गणना यहां एक वैध संपत्ति नहीं है।

यहां कोई भी सहायता की सराहना की जाएगी।

उत्तर

9

यदि आप एसक्यूएल भूमि में हैं, तो प्रत्येक रिपोर्ट एक अलग समूह है, जो आपको बताती है कि आपको केवल तीन महीने की आवश्यकता है - एक महीने के साथ एक, सप्ताह में प्रविष्टियों के साथ, एक महीने प्रति माह, और एक वर्ष (या आप वास्तव में क्वेरी करने के तरीके के आधार पर थोड़ा अलग हो सकते हैं।

अब, आपके पास डेटटाइम है - जो कुछ समस्याएं प्रस्तुत करता है - आप वास्तव में करना चाहते हैं दिनांक दिनांक दिनांक का वर्ष घटक है, उस दिनांक के दिनांक समय और दिन घटक का महीना घटक। (या इनमें से केवल एक या दो आप जिस रिपोर्ट को उत्पन्न करना चाहते हैं उसके आधार पर।

मैं केवल पैरा-उद्धरण हूं इतनी स्पष्ट रूप से अपने यहाँ कोड यह संकलन नहीं होगा, लेकिन:

public class ViewedContentIndex : 
    AbstractIndexCreationTask<ViewedContent, ViewedContentResult> 
{ 
public ViewedContentIndex() 
{ 
    Map = docs => from doc in docs 
        select new 
          { 
           doc.ProductId, 
           Day = doc.DateViewed.Day, 
           Month = doc.DateViewed.Month, 
           Year = doc.DateViewed.Year 
           Count = 1 
          }; 

    Reduce = results => from result in results 
         group result by new { 
          doc.ProductId, 
          doc.DateViewed.Day, 
          doc.DateViewed.Month, 
          doc.DateViewed.Year 
         } 
         into agg 
         select new 
            { 
             ProductId = agg.Key.ProductId, 
             Day = agg.Key.Day, 
             Month = agg.Key.Month, 
             Year = agg.Key.Year 
             Count = agg.Sum(x => x.Count) 
            }; 
} 

}

उम्मीद है कि आप क्या मैं इस से प्राप्त करने के लिए कोशिश कर रहा हूँ देख सकते हैं - आपके द्वारा अपने समूह में सभी घटकों चाहते हैं, के रूप में वे आपके समूह को अद्वितीय बनाते हैं।

मुझे याद नहीं है कि रावेनडीबी आपको डेटटाइम्स के साथ ऐसा करने देता है और मुझे यह कंप्यूटर नहीं मिला है, इसलिए यह सत्यापित नहीं कर सकता है, लेकिन सिद्धांत वही बना हुआ है।

तो, फिर से पुनरावृति करने के लिए

सप्ताह + उत्पाद आईडी अपनी रिपोर्ट के लिए एक सूचकांक चाहते हैं तो आप महीने + उत्पाद आईडी अपनी रिपोर्ट के लिए एक सूचकांक चाहते हैं तो आप साल अपनी रिपोर्ट के लिए एक सूचकांक चाहते + उत्पाद आईडी

मुझे आशा है कि इस मदद करता है, खेद मैं नहीं आप एक compilable उदाहरण दे सकता हूँ, कौवे की कमी यह थोड़ा मुश्किल :-)

+0

हाँ बनाता है, कि यह था! यहां मानसिक बदलाव यह देखने में था कि मैं किसी वस्तु पर समूह कर सकता हूं न केवल एक फ़ील्ड। आखिरकार, हमें तारीखों की रोलिंग विंडो पर पूछना होगा। लेकिन, यह मुझे बिल्कुल वही देता है जो मुझे चाहिए। एक बार फिर धन्यवाद! –

संबंधित मुद्दे