Ravendb Multimapping на одном и том же наборе документов для создания объекта запроса?

Я изучаю RavendDb, используя его в проекте и пытаюсь что-то делать. У меня нет опыта работы с SQL / реляционными базами данных, поэтому мне легче использовать сокращение карты и базы данных документов.

Я пытаюсь создать один статический индекс для создания объекта, содержащего счетчик появления 4 полей условий, вместо создания 4 статических индексов и объединения результатов после 4 запросов к базе данных.

Вот статический индекс:

public class Client_ProductDeploymentSummary : AbstractIndexCreationTask<Product, ClientProductDeploymentResult>
{
    public Client_ProductDeploymentSummary()
    {
        Map = products =>
              from product in products
              select new {
                  product.ClientName, 
                  NumberProducts = 1,
                  NumberProductsWithCondition = 0,
                  NumberProductsWithoutCondition = 0,
                  NumberProductsConditionTestInconclusive = 0
              };

        Map = products =>
              from product in products
              where product.TestResults.Condition == true
              select new
              {
                  product.ClientName,
                  NumberProducts = 0,
                  NumberProductsWithCondition = 1,
                  NumberProductsWithoutCondition = 0,
                  NumberProductsConditionTestInconclusive = 0
              };

        Map = products =>
              from product in products
              where product.TestResults.Condition == false
              select new
              {
                  product.ClientName,
                  NumberProducts = 0,
                  NumberProductsWithCondition = 0,
                  NumberProductsWithoutCondition = 1,
                  NumberProductsConditionTestInconclusive = 0
              };

        Map = products =>
              from product in products
              where product.TestResults.Condition == null
              select new
              {
                  product.ClientName,
                  NumberProducts = 0,
                  NumberProductsWithCondition = 0,
                  NumberProductsWithoutCondition = 0,
                  NumberProductsConditionTestInconclusive = 1
              };

        Reduce = results =>
                from result in results
                group result by result.ClientName
                into g
                select new ClientProductDeploymentResult() 
                { 
                    ClientName = g.Key, 
                    NumberProducts = g.Sum(x => x.NumberProducts),
                    NumberProductsWithCondition = g.Sum(x => x.NumberProductsWithCondition),
                    NumberProductsWithoutCondition = g.Sum(x => x.NumberProductsWithoutCondition),
                    NumberProductsConditionTestInconclusive = g.Sum(x => x.NumberProductsConditionTestInconclusive)
                };
    }
}

Я добавил 4 переменные к каждому оператору select new, чтобы индекс компилировался и развертывался в моем модульном тесте. Кажется, я не могу использовать функцию AddMap (...), как я видел в некоторых примерах (я понимаю, что просто перезаписываю переменную Map). Клиентов не так много, среди десятков или сотен, но, возможно, много Продуктов, определенно по 1000 на одного клиента.

Есть ли краткий способ составить цель этого индекса? Или можно уменьшить на одну карту для каждого поля и объединить результаты в коде вызывающего абонента?


person craastad    schedule 20.11.2012    source источник
comment
Добро пожаловать в RavenDB! Я с нетерпением жду вашей перспективы и будущих вопросов, так как большинство из нас не учатся своему реляционному мышлению.   -  person Matt Johnson-Pint    schedule 20.11.2012


Ответы (1)


Индексы MultiMap имеют другой базовый класс. Вы должны унаследовать от AbstractMultiMapIndexCreationTask, чтобы создать индекс нескольких карт.

Однако то, что вы здесь описываете, не подходит для мульти-карты. Multimap используется, когда данные поступают из разных исходных документов, а не при разных условиях. Что вам нужно, так это один оператор карты, в который встроена ваша условная логика.

Map = products =>
  from product in products
  select new {
    product.ClientName, 
    NumberProducts = 1,
    NumberProductsWithCondition = product.TestResults.Condition == true ? 1 : 0,
    NumberProductsWithoutCondition = product.TestResults.Condition == false? 0 : 1,
    NumberProductsConditionTestInconclusive = product.TestResults.Condition == null ? 1 : 0
  };
person Matt Johnson-Pint    schedule 20.11.2012
comment
Именно то, что я искал! На встроенную логику приятно смотреть. Да, я сравниваю значение NULL в bool, допускающем значение NULL (и нужно просто сделать это в коде), поскольку это ценная информация для меня. - person craastad; 21.11.2012
comment
Тогда вы, вероятно, захотите также проверить на! = Null (или на .HasValue) в каждом условии, а не только в неубедительном. - person Matt Johnson-Pint; 21.11.2012