1

我在 RavenDB 中有两个集合:一个用于产品,另一个用于每个产品的定价策略。每个定价策略都按产品 ID 引用单个产品。例如,产品可能如下所示:

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

策略可能如下所示:

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

我需要能够通过它们的属性以及相关产品的属性来查询策略。例如 - 返回产品属于特定类别且具有特定利润的所有策略。如果产品数据被非规范化并与策略一起存储,那么我可以简单地将产品属性添加到索引中。有没有办法在不进行非规范化的情况下做到这一点?

我了解 Include 方法允许在结果集中包含引用的实体,因此不必加载它们,但它不支持对包含的实体进行查询。实时投影也是如此——它们允许在结果集中包含引用的实体,但不支持通过引用实体的属性进行查询

我可以跨两个索引运行两个查询——一个用于策略,另一个用于产品,然后在产品 ID 上加入两个结果集。这种情况下的问题是产品集合可能并不总是与策略引用的产品集同步。更具体地说,产品集合可能包含比策略引用的产品更多的产品,因此查询可能会返回没有定价策略的产品,因此在占据结果集中的位置时不能一直加入策略.

如果我可以解析 Map 函数中的引用实体,然后在索引中包含引用实体的属性,那么可行的方法是。

编辑 我似乎正在寻找这个:https ://groups.google.com/d/msg/ravendb/k3qvdEb870U/95OWtjL3U3YJ

4

1 回答 1

1

经过一些实验,我发现最好的方法是使用Multi-Maps / Reduce Index。指定了两个映射函数,一个用于产品,另一个用于策略。reduce 函数按产品 ID 对两个结果集进行分组,然后在输出中合并。这个索引的声明有点尴尬,因为您必须确保结果的形状匹配 - 如果 Raven 自动执行此操作并带有覆盖选项会很好。在 reduce 函数中合并结果也很尴尬,因为您必须从来自所需映射函数的组中选择一个值。总的来说,多映射/减少索引允许将不同的集合连接到单个索引投影中。

于 2012-08-20T23:18:42.010 回答