我有一系列制造商,他们每个都生产几种产品。制造商可以使用字符串标签,我想按照制造商标签搜索产品(这样标签就是产品从制造商那里继承的。)
这样做的一种方法是创建一个索引,在TransformResults
部分中,将制造商的标签添加到每个产品中。
from product in results
select new {
...,
Tags = Database.Load("manufacturers/"+ product.ManufacturerId).Tags
}
但我似乎无法查询它:
this.Query<T>("TaggedProducts").Where(s => s.Tags.Any(tag => tag=="reliable"));
因为标签没有编入索引。我正在使用RavenDB Studio。
这是地图:
from product in docs.Products
select new {
product.Id,
product.ManufacturerId
}
我不清楚是否需要定义一个字段,我找不到任何解释该字段的文档。
这些是类:
class Manufacturer
{
public int Id {get; set;}
public List<string> Tags {get; set;}
}
class Product
{
public int ManufacturerId {get; set;}
public int Id {get; set;}
}
请注意,我尝试避免在Product类中添加Tags字段(如果可能的话),因为这会给错误的印象,即可以在故事中设置标记。
答案 0 :(得分:1)
您在Map中添加的内容是索引的内容以及您在TransformResults中放置的内容是您从成功查询中获得的内容。因此,除非您在地图中添加标记,否则永远无法查询标记。
您可以做的是在地图中使用LoadDocument
。这是一个fairly new功能,可在2.0中使用。文档在这里:http://ravendb.net/docs/2.0/client-api/querying/static-indexes/indexing-related-documents
这可能是你的情况下地图的样子:
from product in docs.Products
select new {
product.Id,
product.ManufacturerId,
Tags = LoadDocument("manufacturers/"+ product.ManufacturerId).Tags
}
您正在使用的TransformResults可以保持不变。
提示是使用管理工作室并查看索引内容。您可以在索引中执行此操作 - &gt; [您的索引] - &gt;查询然后从查询选项下拉列表中选中索引条目复选框。