在RavenDB中匹配具有多个外键的项目

时间:2011-07-17 16:03:15

标签: nosql ravendb

我之前就SQL Server问过这个问题:Complicated SQL Query--finding items matching multiple different foreign keys

基本上,我需要能够找到符合多个标准的产品。我有一个场景,我需要找到符合多个类别的产品,并且可以在多个发票中找到。

解决方案是一组相当复杂的联盟,相当于计算产品符合条件的次数,并过滤计数与标准数相匹配的项目。

 ; with data (ID, Count) as (
      select pc.ProductID, count(*) from ProductCategories pc (nolock)
           inner join @categoryIDs /*table valued param*/ c on c.ID = pc.CategoryID
      union all
      select ip.ProductID, count(*) from InvoiceProducts ip (nolock)
           inner join @invoiceIDs i on i.ID = ip.InvoiceID 
 )
      select d.ID from data d
           group by d.ID
           having sum(d.Count) = @matchcount

但是现在,我正在考虑一个NoSQL提供商。所以我的问题是,如何创建一个索引函数来匹配RavenDB(或其他一些NoSQL项目)中的这种查询?

1 个答案:

答案 0 :(得分:1)

要使用RavenDB(或任何其他文档数据库)正确设置,需要进行心理转换。问题在于我们在处理针对SQL服务器的结构化数据时常常遇到的黑客攻击。

因此,这里的问题是您的数据是如何建模的。更确切地说 - 你最常使用它的方式;基于哪些实体定义以及如何将它们链接在一起的某些指导原则。

对于一个简单的Product对象,使用String []类别,您可以像这样查询DB:

   // Query on nested collections - will return any product with category "C#"
    products = from p in session.Query<Product>()
               where p.Categories.Any(cat => cat == "C#")
               select c;

您可以根据需要添加任意数量的Where子句。将自动为您创建索引 - 但建议您在确定模型时使用静态索引。

有关此主题的更多信息:

http://ayende.com/blog/4801/leaving-the-relational-mindset-ravendbs-trees

https://github.com/ravendb/docs