1

我有以下文档模型:

public class Product
{
    public int Id {get;set;}
    public string Name {get;set;}
    // ...
}

public class Customer
{
    public int Id {get;set;}
    public string Name {get;set;}
    // ...
}

public class ProductOrder
{
    public int Id {get;set;}
    public int ProductId {get;set;}
    public int CustomerId {get;set;}
    public int Quantity {get;set;}
    // ...
}

在查询 a 时,Product我还想知道订购产品的数量 ( Quantity) 和唯一客户。相同Customer,我想获得订购产品的数量。

如何使用 RavenDB 实现这一目标?使用索引,我只能访问Load<>另一个实体,而不是所有引用我查询的实体的实体。

由于产品的订单数量可能非常多,因此我没有将它们添加到文档中,因此在使用orProduct进行索引期间我无法访问订单。Include<>LoadDocument<>

我的模型对于 DocumentDB 是错误的,还是有其他方法可以获取这些信息?如果是这样,如何更好地做到这一点?

谢谢。

更新

这是我的订单数量索引:

public class ProductOrder_CountByProduct : AbstractIndexCreationTask<ProductOrder, ProductOrder_CountByProduct.Result>
{
    public class Result
    {
        public int ProductId { get; set; }
        public int NumberOfOrders { get; set; }
    }

    public ProductOrder_CountByProduct()
    {
        Map = orders => from order in orders
                          select new
                                     {
                                         ProductId = order.ProductId,
                                         NumberOfOrders = order.Quantity
                                     };

        Reduce = results => from result in results
                            group result by result.ProductId
                            into g
                            select new
                                       {
                                           ProductId = g.Key,
                                           NumberOfOrders = g.Sum(p => p.NumberOfOrders)
                                       };
    }
}

现在我可以按产品 ID 获取订单数量:

var result = documentSession.Query<ProductOrder_CountByProduct.Result, ProductOrder_CountByProduct>()
                            .FirstOrDefault(p => p.ProductId == product.Id)
                            ?? new ProductOrder_CountByProduct.Result();

var count = result.NumberOfOrders;

CountByCustomer查询/索引相同。到目前为止,对于Product.

但我的目标是查询产品(按名称或描述)并填写以下数组:

public class ProductViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public int NumberOfOrders { get; set; }
    public int NumberOfCustomers { get; set; }

    //... maybe NumberOfCustomersFromUSA, etc.
}

然后我需要使用CountByProductandCountByCustomer索引来遍历产品查询的每个结果并CountByXY为每个结果执行 2 个查询。

这是要走的路吗?

4

1 回答 1

1

你真的不想为每个项目打电话。这是一个“选择 N+1”的问题。Raven 实际上会阻止您这样做,方法是将您在单个会话中可以发出的请求数限制为 30 个。

您可以使用几种不同的技术。

选项1

如果您希望能够查询名称和描述字段:

  • 在索引图中包含名称和描述。
  • 将它们包含在 reduce 键中,并且不加修改地传递它们。
  • 然后,您可以将它们包含在Where查询的谓词中。

选项 2

如果您只想要输出中的名称和描述字段,但不想通过它们进行查询:

  • TransformResults向您的索引添加一个步骤。
  • 在转换中,按您分组的 id 加载产品。
  • 从加载的产品中返回名称和描述字段,以及原始聚合计数。

选项 3

与选项 2 相同的场景,但无需转换即可

  • 查询时,在查询自定义中指定Include
  • 当您遍历结果时,您可以加载产品详细信息而无需实际访问服务器,因为它们已包含在内。在此处阅读更多内容。

选项 4

您可能需要考虑使用Indexed Properties Bundle将这些查询的结果写回到产品文档的属性中。这样,您可以只查询产品,并且您的数据都在一个地方——即使它们被聚合在多个索引中。

--

例如,您可能希望组合上述多种技术 - 您可能希望在查询中包含产品名称,以便您可以通过它进行查询,但您可能希望仅显示产品描述,以便将查询结果转换为返回它。

你说的一件事听起来不太对劲。为什么要在产品视图模型中返回客户数量?除非它的“订购此产品的客户数量” - 那么它可能不属于那里。

于 2013-06-06T16:46:01.627 回答