C# 在同一组文档上进行Ravendb多重映射以构建查询对象?

C# 在同一组文档上进行Ravendb多重映射以构建查询对象?,c#,nosql,mapreduce,ravendb,document-database,C#,Nosql,Mapreduce,Ravendb,Document Database,我正在学习RavendDb,通过在项目中使用它并尝试做一些事情。我没有SQL/relational db方面的经验,这就是为什么我发现使用map reduce和document数据库更容易的原因 我试图创建一个静态索引来创建一个对象,该对象保存4个条件字段的出现次数,而不是创建4个静态索引并在4个数据库查询后组合结果 以下是静态索引: public class Client_ProductDeploymentSummary : AbstractIndexCreationTask<Produ

我正在学习RavendDb,通过在项目中使用它并尝试做一些事情。我没有SQL/relational db方面的经验,这就是为什么我发现使用map reduce和document数据库更容易的原因

我试图创建一个静态索引来创建一个对象,该对象保存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)
                };
    }
}
公共类客户端\u产品部署摘要:AbstractIndexCreationTask
{
公共客户端\u ProductDeploymentSummary()
{
地图=产品=>
从产品到产品
选择新的{
product.ClientName,
NumberProducts=1,
NumberProductsWithCondition=0,
NumberProductsWithoutCondition=0,
NumberProductsConditionTestInconclusive=0
};
地图=产品=>
从产品到产品
其中product.TestResults.Condition==true
选择新的
{
product.ClientName,
NumberProducts=0,
NumberProductsWithCondition=1,
NumberProductsWithoutCondition=0,
NumberProductsConditionTestInconclusive=0
};
地图=产品=>
从产品到产品
其中product.TestResults.Condition==false
选择新的
{
product.ClientName,
NumberProducts=0,
NumberProductsWithCondition=0,
NumberProductsWithoutCondition=1,
NumberProductsConditionTestInconclusive=0
};
地图=产品=>
从产品到产品
其中product.TestResults.Condition==null
选择新的
{
product.ClientName,
NumberProducts=0,
NumberProductsWithCondition=0,
NumberProductsWithoutCondition=0,
NumberProductsConditionTestInconclusive=1
};
减少=结果=>
从结果到结果
按result.ClientName对结果进行分组
进入g
选择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)
};
}
}
我在每个select new语句中添加了4个变量,以便在单元测试中编译和部署索引。在一些示例中,我似乎无法使用AddMap(…)函数(我意识到我只是在覆盖Map变量)。在10年代或100年代,没有那么多的客户,但可能有很多产品,每个客户肯定有1000种


是否有一种简洁的方法来构建该索引的意图?或者每个字段使用一个map reduce并将结果合并到调用方代码中是更好的方法吗?

多映射索引具有不同的基类。您可以从
AbstractMultiMapIndexCreationTask
继承来创建多映射索引

但是,您在这里描述的内容不适用于multimap。当数据来自不同的源文档时,而不是在条件不同时,可以使用多重映射。您需要的是一个将条件逻辑内联的map语句

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

欢迎来到RavenDB!我期待着看到你的观点和未来的问题,因为我们大多数人都在学习我们的关系思维。这正是我想要的!内联逻辑看起来很有趣。是的,我在一个可为null的bool上与null进行比较(应该在代码中这样做),因为它对我来说是有价值的信息。那么您可能还想测试!=在每个条件中为null(或for.HasValue),而不仅仅是不确定的条件。