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

Nosql 在RavenDB中匹配具有多个外键的项,nosql,ravendb,Nosql,Ravendb,我以前问过有关SQL Server的以下问题: 基本上,我需要能够找到符合多个标准的产品。我有一个场景,在这个场景中,我需要找到与多个类别中的每个类别相匹配的产品,并在多个发票中找到这些产品 解决方案是一组相当复杂的联合,这相当于计算产品与标准匹配的次数,并过滤计数与标准匹配的项目 ; with data (ID, Count) as ( select pc.ProductID, count(*) from ProductCategories pc (nolock)

我以前问过有关SQL Server的以下问题:

基本上,我需要能够找到符合多个标准的产品。我有一个场景,在这个场景中,我需要找到与多个类别中的每个类别相匹配的产品,并在多个发票中找到这些产品

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

 ; 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项目中创建一个索引函数来匹配这种查询?

要正确设置RavenDB或任何其他文档数据库,需要进行心理转换。问题在于我们在针对SQL server处理结构化数据时所使用的黑客

因此,这里的问题是如何对数据建模。更确切地说,你打算如何最经常地使用它;基于此,有一些关于定义哪些实体以及如何将它们联系在一起的准则

对于一个简单的产品对象,使用类别字符串[],您可以像这样查询数据库:

   // 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子句。索引将自动为您创建-但建议您在确定模型后使用静态索引

有关此主题的更多信息:


是的,我知道有一个范式的转变。棘手的部分在于匹配多个键。当我需要找到每个类别都有的产品时,事情会变得复杂得多。类似于会话中p的products=from。查询其中categories.Allcat0=>p.categories.Anycat1=>cat1==cat0选择c;但在生产环境中,您会这样做吗?看起来这个比例不太合适。。。至少我的关系思维告诉我的是,在RavenDB中,查询的复杂性与缩放无关。您只是在查询索引。通过尝试,不支持All。请参阅:。我认为如果你能在邮件列表中告诉我们你的场景,我们会帮助你创建一个合适的模型和匹配的查询,这会容易得多。