私はRavendDbをプロジェクトで使用し、何かをしようとして学習しています。SQL /リレーショナルデータベースの経験がないので、mapreduceとドキュメントデータベースを使用する方が簡単だと思います。
4つの静的インデックスを作成して4つのデータベースクエリの結果を組み合わせるのではなく、1つの静的インデックスを作成して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)
};
}
}
単体テストでインデックスをコンパイルしてデプロイするために、selectnewステートメントごとに4つの変数を追加しました。いくつかの例で見たように、AddMap(...)関数を使用できないようです(Map変数を上書きしているだけだとわかります)。10年代または100年代にはそれほど多くのクライアントはありませんが、おそらくクライアントあたり1000年代には多くの製品があります。
このインデックスの意図を構築するための簡潔な方法はありますか?または、フィールドごとに1つのマップを削減し、その結果を呼び出し元コードで組み合わせるのがより良い方法ですか?