RavenDB结果变换器列在文档内(RavenDB 2.5)

时间:2015-04-08 10:34:22

标签: ravendb

考虑这种情况:

  1. 示例文档:

    {
        "Order": {
            "Products": [
                {
                    "ProductCode": 131131,
                    "Description": "shipped product",
                    "Shipped": true
                },
                {
                    "ProductCode": 33333,
                    "Description": "not shipped product",
                    "Shipped": false
                },
                {
                    "ProductCode": 87138,
                    "Description": "shipped product",
                    "Shipped": true
                },
            ]
        }
    }
    
  2. 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
                                                };
        }
    }
    
  3. 查询: 我想通过字段'shipping'查询这些文档,并使用转换来提取产品列表的所有值:

      var products = this.session.Query<ProductViewModel, MyIndex>()
            .Where(x => x.Shipped == true) // or .Where(x => x.Shipped == false)
            .TransformWith<MyTransformer, ProductViewModel>()
            .ToList();
    
  4. 问题:查询结果是SAME更改where子句(Shipped:true / Shipped:false),很明显我在发货时需要第一个和第三个文档:true和第二个发货时:false; 我正在使用RavenDB 2.5.2874;

1 个答案:

答案 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个文档可能生成未知数量的索引条目时,它可能会导致性能问题。

有几种可能的解决方案,但您应该问自己的第一个问题是,您是否希望对数据建模有所不同?产品真的可以发货吗?不是订单(包含产品)是否已发货?

希望这有帮助!