0

私は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つのマップを削減し、その結果を呼び出し元コードで組み合わせるのがより良い方法ですか?

4

1 に答える 1

2

MultiMap インデックスには、異なる基底クラスがあります。から継承しAbstractMultiMapIndexCreationTaskて、マルチマップ インデックスを作成します。

ただし、ここで説明することはマルチマップには適していません。マルチマップは、条件が異なる場合ではなく、異なるソース ドキュメントからデータが取得される場合に使用します。必要なのは、条件付きロジックをインラインにした単一の 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
  };
于 2012-11-20T16:08:36.803 に答える