Querying a child collection by multiple values in RavenDB

前端 未结 3 2006
野性不改
野性不改 2021-01-02 20:21

I\'m using RavenDB build 371 and I have the following model:

class Product {
 public string Id { get; set; }
 public ProductSpec[] Specs { get; set; }
}

cla         


        
相关标签:
3条回答
  • 2021-01-02 20:38

    As per build 717 you can do this using the new .Intersect() feature that has been done by Matt Warren. Take a look here: http://issues.hibernatingrhinos.com/issue/RavenDB-51

    0 讨论(0)
  • 2021-01-02 20:45

    I've changed the model a bit and was able to achieve the desired result using the Project method in AbstractIndexCreationTask. This is the (simplified) data model:

    public class Product
    {
        public string Id { get; set; }
        public int CategoryId { get; set; }
        public int TotalSold { get; set; }
        public Dictionary<string, string> Specs { get; set; }
    }
    

    This is the index definition:

    public class Products_ByCategoryIdAndSpecs_SortByTotalSold : AbstractIndexCreationTask<Product>
    {
        public Products_ByCategoryIdAndSpecs_SortByTotalSold()
        {
            this.Map = products => from product in products
                                   select new
                                   {
                                       product.CategoryId,
                                       _ = Project(product.Specs, spec => new Field("Spec_" + spec.Key, spec.Value, Field.Store.NO, Field.Index.ANALYZED)),
                                       product.TotalSold
                                   };
        }
    }
    

    Then I can query like so:

        var results = session.Advanced.LuceneQuery<Product, Products_ByCategoryIdAndSpecs_SortByTotalSold>()
            .WhereEquals("CategoryId", 15920)
            .AndAlso().WhereEquals("Spec_Class", "3A")
            .AndAlso().WhereEquals("Spec_Finish", "Plain")
            .OrderBy("-TotalSold")
            .ToList(); 
    

    This will return the products in category "15920" which have a "Class" spec value of "3A" and a "Finish" spec value of "Plain" sorted in descending order by the total units sold.

    The key was using the Project method which basically creates fields in the Lucene document for each spec name-value pair.

    0 讨论(0)
  • 2021-01-02 20:49

    I have tried different things, and could not make it work either. The specific query you are trying to execute is resolved to this Lucene query by RavenDB (in version 426):

    "{(Name:Color AND Value:Red) AND (Name:Country AND Value:US)}" which explains why you get no result.

    After googling on the subject, I found this post: Lucene Query Syntax

    Different workarounds are suggested among the answers. Hope this will help. Im rather curious myself though, if this really isn't possible.

    0 讨论(0)
提交回复
热议问题