0

我有很多制造商,每个制造商都生产几种产品。制造商可以有字符串标签,我想通过他们的制造商标签搜索产品(这样标签是产品从制造商继承的)。

这样做的一种方法是创建一个索引,在该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 类中添加标签字段,因为这会给人一种错误的印象,即标签可以在故事中设置。

4

1 回答 1

1

您放入 Map 的内容是被索引的内容,您放入 TransformResults 的内容是您从成功查询中返回的内容。因此,除非您将标签添加到地图中,否则您永远无法查询标签。

您可以做的是LoadDocument在地图中使用。这是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 可能保持不变。

一个提示是使用管理工作室并查看索引的内容。您可以在 Indexes -> [your index] -> Query 中执行此操作,然后从Query Options下拉菜单中选中Index entries复选框。

于 2013-08-01T09:43:23.813 回答