سؤال

أنا أبحث عن مثال على كيفية تنفيذ واستخدام Reduce في عميل RavendB .NET.

أرغب في تطبيقه على سيناريو محدد: توليد تعداد فريد من نوعه وإجمالي الزوار.

مستند عينة سيتم تخزينه داخل RavendB:

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

يمكنني معرفة كيفية إنشاء فهرس قياسي باستخدام MAP ، لكنني ضائع بشأن كيفية استخدام وظيفة تقليل بالفعل ، ثم استرداد النتائج.

لسوء الحظ، ال مثال مقدم على موقع Ravendb لا يفسر ما يجري حتى أتمكن من فهم كيفية استخدامه عبر .NET API ، ولا يبدو أن العينات تنفذ هذا على الإطلاق باستخدام .NET API.

هل كانت مفيدة؟

المحلول

إن مؤشر تقليل الخريطة هو مجرد طريقة أخرى لقول "أريد أن أقوم بمجموعة" ، فقط المجموعة المحددة مسبقًا مقدماً ، وسوف يقوم 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();

كما تتوقع (لا توجد خريطة/تقليل مطلوب)

ملاحظة: يمكن أيضًا استخدام هذا الفهرس لمعرفة عدد الزيارات من قبل مستخدم معين ، حيث يتم حساب العد في الفهرس ، إذا كنت لا تهتم بالعد ، ثم قم بإسقاط هذا الجزء من MapReduce و DO

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
                    };
    }
}

نصائح أخرى

إليكم كيف يمكنك إنشاء فهرس للزوار الفريدين:

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) };
    }
}

يمكنك بعد ذلك الاستعلام عن هذا باستخدام:

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

للحصول على إجمالي عدد الزوار ، يمكنك استخدام:

var numberOfVisitors = s.Query<StatisticEntry>().Count();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top