Предикат на карте или уменьшить (RavenDb)? - PullRequest
3 голосов
/ 22 марта 2012

Если я хочу применить предикат к документу перед агрегацией в функции Reduce, хочу ли я разместить этот предикат в функции Map или в функции Reduce?

Так, например, помещение предиката в функцию Map будет выглядеть так:

        Map = orders => orders
            .Where(order => order.Status != OrderStatus.Cancelled)
            .Select(order => new
                {
                    Name = order.Firstname + ' ' + order.Lastname,
                    TotalSpent = order.Total,
                    NumberOfOrders = 1
                });
        Reduce = results => results
            .GroupBy(result => result.Email)
            .Select(customer => new
                {
                    Name = customer.Select(c => c.Name).FirstOrDefault(),
                    TotalSpent = customer.Sum(c => c.TotalSpent),
                    NumberOfOrders = customer.Sum(c => c.NumberOfOrders)
                });

И помещение его в функцию Reduce будет выглядеть так:

        Map = orders => orders
            .Select(order => new
                {
                    Name = order.Firstname + ' ' + order.Lastname,
                    TotalSpent = order.Total,
                    NumberOfOrders = 1,
                    Status = order.Status
                });
        Reduce = results => results
            .Where(order => order.Status != OrderStatus.Cancelled)
            .GroupBy(result => result.Email)
            .Select(customer => new
                {
                    Name = customer.Select(c => c.Name).FirstOrDefault(),
                    TotalSpent = customer.Sum(c => c.TotalSpent),
                    NumberOfOrders = customer.Sum(c => c.NumberOfOrders),
                    Status = (OrderStatus)0
                });

Последнее, очевидно, имеет больше смысла, однако это означает, что мне нужно добавить свойство Status к классу результата Reduce, а затем просто установить его на какое-то неизвестное значение в Reduce, поскольку это на самом деле ничего не значит.

1 Ответ

4 голосов
/ 22 марта 2012

Только первый подход работает для карты / уменьшения.И нет, порядок будет игнорироваться, и вы не сможете сделать что-то вроде FirstOrDefault в результате.

Вы должны думать о карте / уменьшении как о двух независимых функциях, тогда как функция уменьшения может запускаться несколько раз на одном и том же входе, поэтому формат ввода должен соответствовать формату вывода.Это также может происходить на разных серверах параллельно и асинхронно, поэтому новые документы можно сохранять во время выполнения индексации.

...