在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);
}
我已經將它變得有點髒的感覺,但這是存儲/查詢方式/刪除指定集合名稱時運行?還是我以這種方式陷入困境?
爲什麼你會有不同類型的產品,但使用相同的類類型?他們似乎沒有那麼不同。 –
就我而言,我正在研究一個通用框架,其中我有一個名爲Entity的類。在運行時,可以在不創建新的C#類並重新編譯任何代碼的情況下配置新的實體類型。 我有一個屬性定義其類型的實體。如果我可以告訴烏鴉DB根據屬性將文檔拆分爲單獨的集合,而不是創建新類並重新編譯代碼,那麼問題可以概括爲一個通用問題。 –