2010-11-23 16 views
22

का उपयोग कर उदाहरण को मैं RavenDB .NET क्लाइंट के अंदर मानचित्र-न्यूनीकरण को कार्यान्वित करने और उपयोग करने का एक उदाहरण ढूंढ रहा हूं।RavenDB मानचित्र-कम करें उदाहरण .NET क्लाइंट

मैं इसे एक विशिष्ट परिदृश्य पर लागू करना चाहता हूं: अद्वितीय और कुल विज़िटर गणना उत्पन्न करना।

एक नमूना दस्तावेज है कि RavenDB भीतर संग्रहीत किया जाएगा:

public class StatisticsEntry 
{ 
    public string Id { get; set; } 
    public string UserId { get; set; } 
} 

मैं पता लगा सकते हैं एक मानक सूचकांक मानचित्र का उपयोग कर बनाने का तरीका है, लेकिन मैं कैसे वास्तव में समारोह को कम उपयोग करने के लिए करने के लिए के रूप में खो रहा हूँ, और फिर परिणाम पुनर्प्राप्त करें।

दुर्भाग्यवश, example provided on the RavenDB Site यह नहीं बताता कि क्या हो रहा है ताकि मैं समझ सकूं कि .NET API के माध्यम से इसका उपयोग कैसे किया जाए, और नमूने .NET API का उपयोग करके इसे लागू करने के लिए प्रतीत नहीं होते हैं।

public class Statistics_UniqueVisitors : AbstractIndexCreationTask<StatisticsEntry> 
{ 
    public Statistics_UniqueVisitors() 
    { 
     Map = entries => from entry in entries 
         select new { entry.UserId, Count = 1 }; 
     Reduce = results => from result in results 
          group result by result.UserId into g 
          select new { UserId = g.Key, Count = g.Sum(x=>x.Count) }; 
    } 
} 

फिर आप इस का उपयोग कर क्वेरी कर सकते हैं::

+0

आप क्या हासिल करना चाहते हैं? क्या आप डेट टाइम का किसी भी तरह उपयोग करना चाहते हैं? (प्रति दिन, प्रति माह, प्रति वर्ष थोड़ी चीजें?) –

+0

वर्तमान में नहीं। इस क्षेत्र का उपयोग कर बाद में मेरे पास अतिरिक्त अनुक्रमणिका हो सकती हैं। इस पल के लिए, मैं वर्ग को इसे सरल बनाने के लिए हटा दूंगा। "प्राप्त करना चाहते हैं" के लिए - मैं आंकड़े उत्पन्न करना चाहता हूं ए) सांख्यिकी एंटर्री की कुल गणना और बी) अद्वितीय उपयोगकर्ता। –

+0

ठीक है - क्योंकि आपको उस प्रकार के परिदृश्य में एक समूह/प्रति समूह 'समूह' को कम करने की आवश्यकता होगी - जवाब एक जिफ्फी –

उत्तर

38

एक नक्शा इंडेक्स को कम करने का एक और तरीका है "मैं एक समूह करना चाहता हूं", केवल समूह द्वारा पूर्व है - सामने की ओर अग्रसर और RavenDB पृष्ठभूमि में इसे कुशल तरीके से संसाधित करेगा ताकि क्वेरी समय पर आप पूर्व-गणना वाले परिणाम देख रहे हों।

(अद्वितीय उपयोगकर्ताओं के लिए)

var results = from doc in docs 
group doc by doc.UserId into g 
select new 
{ 
     g.UserId, 
     g.Count() 
} 

बनाया सरणी के वास्तविक सामग्री की उपेक्षा से एक साधारण समूह के रूप में एक जवाब के रूप में निम्नलिखित पर विचार करें, हम

results.Length 
मांगकर कुल परिणाम प्राप्त कर सकते

जैसा कि आप उम्मीद करेंगे।

RavenDB में, आप एक नक्शा और एक कम में इस समारोह बाहर विभाजित है, और आप

public class UniqueVisitorsResult 
{ 
    public string UserId { get; set; } 
    public int Count { get; set; } 
} 

public class UniqueVisitorsIndex : AbstractIndexCreationTask<StatisticsEntry, UniqueVisitorsResult> 
{ 
    public UniqueVisitorsIndex() 
    { 
     Map = docs=> from doc in docs 
         select new 
         { 
          UserId = doc.UserId, 
          Count = 1 
         }; 
     Reduce = results => from result in results 
         group result by result.UserId into g 
         select new 
         { 
          UserId = g.Key, 
          Count = g.Sum(x=>x.Count) 
         }; 
    } 
} 

संक्षेप में अंत, इस से ऊपर के रूप में एक ही है - लेकिन आप इसे एक में बदल गया है MapReduce समारोह ;-)

session.Query<StatisticEntry, UniqueVisitorsIndex>().Count(); 

आप, अद्वितीय आगंतुकों की कुल संख्या देंगे गणना संभालने LINQ प्रदाता (iirc मुझे लगता है कि यह है)

कुल में ठीक तरह से लागू कर दिया गया है प्रविष्टियों की संख्या बस

session.Query<StatisticEntry>().Count(); 

आप उम्मीद कर (कोई नक्शा/आवश्यक कम) था के रूप में है

नोट: इस सूचकांक भी गणना के रूप में, किसी विशिष्ट उपयोगकर्ता द्वारा हिट की संख्या को देखने के लिए इस्तेमाल किया जा सकता इंडेक्स में गणना की जा रही है, अगर आपको गिनती की परवाह नहीं है तो मैपराइडस के उस हिस्से को छोड़ दें और

public class UniqueVisitorsIndex : AbstractIndexCreationTask<StatisticsEntry> 
{ 
    public UniqueVisitorsIndex() 
    { 
     Map = docs=> from doc in docs 
        select new 
        { 
         UserId = doc.UserId 
        }; 
     Reduce = results => from result in results 
        group result by result.UserId into g 
        select new 
        { 
         UserId = g.Key 
        }; 
    } 
} 
+0

में आ रहा है। स्पष्टीकरण के लिए धन्यवाद। –

+0

पहले उदाहरण में आप 'count = g.Sum (x => x.Count) 'प्रदान करते हैं - यह मुझे संकलन त्रुटि देता है क्योंकि' x' प्रकार' सांख्यिकी एंटर्री 'है - यह कहां से आना चाहिए? –

+1

ओह, आउटपुट आकार को परिभाषित करें, मुझे उदाहरण को संशोधित करने दें :) –

18

का तरीका यहां बताया अद्वितीय आगंतुकों के लिए एक सूचकांक का निर्माण कर सकते है

var numberOfUniqueVisitors = s.Query<StatisticEntry, Statistics_UniqueVisitors>().Count(); 

आगंतुकों की कुल गिनती के लिए, आप उपयोग कर सकते हैं:

var numberOfVisitors = s.Query<StatisticEntry>().Count();