考虑这种情况:
示例文档:
{
"Order": {
"Products": [
{
"ProductCode": 131131,
"Description": "shipped product",
"Shipped": true
},
{
"ProductCode": 33333,
"Description": "not shipped product",
"Shipped": false
},
{
"ProductCode": 87138,
"Description": "shipped product",
"Shipped": true
},
]
}
}
Index + Transformer
public class MyIndex : AbstractMultiMapIndexCreationTask<ProductViewModel>
{
public MyIndex()
{
this.AddMapForAll<MyDocuments>(docs => from doc in docs
from product in doc.Order.Products
select new ProductViewModel
{
Shipped = product.Shipped
});
}
}
public class MyTransformer : AbstractTransformerCreationTask<MyDocuments>
{
public MyTransformer()
{
this.TransformResults = docs => from doc in docs
from product in doc.Order.Products
select new ProductViewModel
{
ProductCode = product.ProductCode,
Description = product.Description,
Shipped = product.Shipped
};
}
}
查询: 我想通过字段'shipping'查询这些文档,并使用转换来提取产品列表的所有值:
var products = this.session.Query<ProductViewModel, MyIndex>()
.Where(x => x.Shipped == true) // or .Where(x => x.Shipped == false)
.TransformWith<MyTransformer, ProductViewModel>()
.ToList();
问题:查询结果是SAME更改where子句(Shipped:true / Shipped:false),很明显我在发货时需要第一个和第三个文档:true和第二个发货时:false; 我正在使用RavenDB 2.5.2874;
答案 0 :(得分:1)
要回答这个问题,为什么您在发货时获得相同的结果:true / false:
from doc in docs
from product in doc.Order.Products
select new ProductViewModel
{
Shipped = product.Shipped
});
这将为您要编制索引的实体上的所有订单/产品创建一个索引条目。这称为笛卡尔(或扇出)索引。澄清:
ID为“MyDocuments / 1”且包含三个产品且Shipped设置为true,false和true的订单的文档将创建以下索引条目:
Id Shipped
MyDocuments/1 true
MyDocuments/1 false
MyDocuments/1 true
当您查询此索引时,Raven将查找索引属性,然后获取相关的文档ID。在这种情况下,Shipped:true / false都指向同一文档。这就是为什么你得到相同的结果。
我不建议使用扇出索引,因为当1个文档可能生成未知数量的索引条目时,它可能会导致性能问题。
有几种可能的解决方案,但您应该问自己的第一个问题是,您是否希望对数据建模有所不同?产品真的可以发货吗?不是订单(包含产品)是否已发货?
希望这有帮助!