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