1

RavenDB には 2 つのコレクションがあります。1 つは製品用、もう 1 つは各製品の価格戦略用です。各価格戦略は、製品 ID によって単一の製品を参照します。たとえば、製品は次のようになります。

products/1
{
 "Brand":"Dewalt",
 "Model":"ABC123",
 "Category":"Tools"  
}

戦略は次のようになります。

strategies/1
{
 "ProductId":"products/1",
 "PriceCalculation":{
   "$type":"...",
   "Margin":0.2
 }
}

属性だけでなく、関連する製品の属性によっても戦略を照会できる必要があります。たとえば、製品が特定のカテゴリにある特定のマージンを持つすべての戦略を返します。製品データが非正規化され、戦略とともに保存されている場合、製品属性をインデックスに追加するだけで済みます。非正規化せずにこれを行う方法はありますか?

Include メソッドを使用すると、参照されるエンティティを結果セットに含めることができるため、それらを読み込む必要がないことは理解していますが、含まれているエンティティに対するクエリはサポートされていません。同じことがライブ プロジェクションにも当てはまります。参照されるエンティティを結果セットに含めることはできますが、参照されるエンティティの属性によるクエリはサポートされません。

2 つのインデックス (戦略用と製品用) に対して 2 つのクエリを実行し、製品 ID で 2 つの結果セットを結合できます。この場合の問題は、製品コレクションが戦略によって参照される一連の製品と常に同期されているとは限らないことです。より具体的には、製品コレクションには、戦略によって参照されるよりも多くの製品が含まれている可能性があるため、クエリは価格戦略を持たない製品を返す可能性があり、結果セット内の位置を占めている間、戦略に参加することはできません。 .

Map 関数で参照されたエンティティを解決し、参照されたエンティティの属性をインデックスに含めることができれば、うまくいく可能性があります。

編集 私はこれを探しているようです: https://groups.google.com/d/msg/ravendb/k3qvdEb870U/95OWtjL3U3YJ

4

1 に答える 1

1

少し実験した後、これを行う最善の方法はMulti-Maps / Reduce Indexを使用することであることがわかりました。製品用と戦略用の 2 つのマップ関数が指定されています。reduce 関数は、2 つの結果セットを製品 ID でグループ化し、出力にマージします。結果の形状が一致することを確認する必要があるため、このインデックスの宣言は少し厄介です。Raven がオーバーライドするオプションを使用してこれを自動的に行うとよいでしょう。また、reduce 関数での結果のマージは、目的のマップ関数から取得したグループから値を選択する必要があるため、厄介です。ただし、全体として、マルチマップ/インデックスの削減により、個別のコレクションを単一のインデックス付きプロジェクションに結合できます。

于 2012-08-20T23:18:42.010 に答える