RavenDB: как сделать простую карту / уменьшить агрегацию - PullRequest
3 голосов
/ 26 июля 2010

Хорошо, учитывая набор документов, подобных этому:

{ 
  "Name": "A",
  "Price": 1.50
}

Как выполнить простое агрегирование цен в списке?Я не хочу выполнять группировку, просто скалярный результат.

т.е.сумма, среднее и т. д.

Я безуспешно пытался выполнить оба следующих действия:

Только карта :

for doc in docs
select new { sumPrices = Sum(d => d.Price) }

и

Карта :

for doc in docs
select new { price = d.Price }

Уменьшить :

for result in results
select new { sumPrices = Sum(result) }

Ответы [ 2 ]

3 голосов
/ 08 октября 2011

Это должно сработать.

Карта:

from doc in docs.Products
select new { Name = "Total", Total = doc.Price }

Уменьшение:

select new
{
    Name = g.Key,
    Total = g.Sum(x => (double)x.Total)
}

Каждый документ проходит карту, и агрегация происходит вReduce.Но схема, исходящая из карты, все равно должна соответствовать вашему результату.«Итого» для каждого документа - это только его цена.Все они затем суммируются в редукте.

Свойство Name является бесполезным, оно просто предназначено для того, чтобы редуктор мог сгруппировать каждый отдельный документ.

0 голосов
/ 04 августа 2010

Вот что я придумал.

Карта:

from doc in docs 
where doc["@metadata"]["Raven-Entity-Name"] == "Books" 
select new { Name = "Total", Price = doc.Price };

Сокращение:

from result in results 
group result by result.Name 
into g 
select new { Name = g.Key, Price = g.Sum(x => x.Price) }

Однако я смог заставить это работать, только если изменил цену на целое число. Итак, мои два документа выглядят так:

{
    "Name":"B",
    "Price":4
}
{
    "Name":"A",
    "Price":10
}

И мой вывод в формате JSON выглядит следующим образом:

{"Results":[{"Name":"Total","Price":"14","Price_Range":"14"}],"IsStale":false,"TotalResults":1}

Очевидно, что изменение цены на целые числа не является решением. Это может быть ошибка в RavenDB, но я сам новичок в этом, так что я надеюсь, что это просто то, как я делаю Sum() или способ представления данных в документе.

...