2013-08-01 74 views
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;} 
} 

請注意,我試圖避免添加一個標籤領域的產品類,如果可能的話,因爲這會給的虛假印象的標籤可以在故事設定。

回答

1

您在Map中放入的內容是正在編制索引的內容,您在TransformResults中放入的內容是您從成功查詢中獲得的內容。因此,除非將其添加到地圖中,否則您無法查詢這些標籤。

你可以做的是在地圖上使用LoadDocument。這是在2.0中提供的fairly new功能。該文檔是在這裏: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。

小費是使用管理工作室,看看索引。您可以在索引 - > [您的索引] - >查詢然後檢查索引條目複選框從查詢選項下拉下來。

+0

LoadDocument具有與Database.Load類似的功能,但它用於Map階段而不是TransformResults階段。 – Alapago

+0

這是正確的。無論如何,最終的結果是相似的。我不知道他們在索引過程中有什麼影響。 –