2011-08-13 96 views
3

在RavenDB中,我可以存儲產品和類別類型的對象,它們將自動位於不同的集合中。這可以。不同的RavenDB集合與相同類型的文檔

但是如果我有2個邏輯上完全不同類型的產品,但他們使用相同的類呢?或者,而不是2我可以有一個通用數量的不同類型的產品。那麼是否有可能告訴Raven將產品文檔分爲多個集合,讓我們根據產品類中提供的字符串屬性進行說明?

提前謝謝。

編輯: 我創建並註冊了以下StoreListener,它更改要在運行時存儲的文檔的集合。這導致文檔正確地存儲在不同的集合中,從而對文檔進行很好的邏輯分組。

public class DynamicCollectionDefinerStoreListener : IDocumentStoreListener 
{ 
    public bool BeforeStore(string key, object entityInstance, RavenJObject metadata) 
    { 
     var entity = entityInstance as EntityData; 
     if(entity == null) 
      throw new Exception("Cannot handle object of type " + EntityInstance.GetType()); 
     metadata["Raven-Entity-Name"] = RavenJToken.FromObject(entity.TypeId); 
     return true; 
    } 

    public void AfterStore(string key, object entityInstance, RavenJObject metadata) 
    { 

    } 
} 

但是,似乎我不得不調整我的查詢以便能夠返回對象。我礦的典型查詢使用看起來像這樣:

session => session.Query<EntityData>().Where(e => e.TypeId == typeId) 

隨着「TYPEID」是新的烏鴉藏品的名稱(和EntityData對象上保存爲一個單獨的領域過於實體類型的名稱)。

我該如何去追求我的對象?在執行我的查詢之前,我找不到可以在運行時定義集合的位置。

我是否必須執行一些原始lucene查詢?或者我可以實現一個查詢偵聽器?

編輯: 我發現存儲,查詢和刪除使用動態定義的集合對象的方式,但我不知道這是做正確的方式:

文檔存儲監聽器:

(I使用上面定義的類)

方法解析索引名:

private string GetIndexName(string typeId) 
{ 
    return "dynamic/" + typeId; 
} 

存儲/查詢/刪除:

// Storing 
session.Store(entity); 

// Query 
var someResults = session.Query<EntityData>(GetIndexName(entity.TypeId)).Where(e => e.EntityId == entity.EntityId) 
var someMoreResults = session.Advanced.LuceneQuery<EntityData>(GetIndexName(entityTypeId)).Where("TypeId:Colors AND Range.Basic.ColorCode:Yellow) 

// Deleting 
var loadedEntity = session.Query<EntityData>(GetIndexName(entity.TypeId)).Where(e => 
e.EntityId == entity.EntityId).SingleOrDefault(); 
if (loadedEntity != null) 
{ 
session.Delete<EntityData>(loadedEntity); 
} 

我已經將它變得有點髒的感覺,但這是存儲/查詢方式/刪除指定集合名稱時運行?還是我以這種方式陷入困境?

+0

爲什麼你會有不同類型的產品,但使用相同的類類型?他們似乎沒有那麼不同。 –

+0

就我而言,我正在研究一個通用框架,其中我有一個名爲Entity的類。在運行時,可以在不創建新的C#類並重新編譯任何代碼的情況下配置新的實體類型。 我有一個屬性定義其類型的實體。如果我可以告訴烏鴉DB根據屬性將文檔拆分爲單獨的集合,而不是創建新類並重新編譯代碼,那麼問題可以概括爲一個通用問題。 –

回答

3

斯蒂芬, 您可以決定使用集合名稱提供邏輯:

store.Conventions.FindTypeTagName 

這是靜態處理,使用泛型類型。 如果你想在運行時做出這個決定,你可以使用DocumentStoreListner

+0

您能確認我處理自定義集合名稱的方式是否正確?先謝謝你 :) –

相關問題