具有相同类型文档的不同RavenDB集合

时间:2011-08-13 14:08:40

标签: collections definition ravendb

在RavenDB中,我可以存储Products和Categories类型的对象,它们将自动位于不同的集合中。这很好。

但是,如果我有2种逻辑上完全不同类型的产品但是它们使用相同的类呢?或者代替2,我可以拥有通用数量的不同类型的产品。那么是否有可能告诉Raven将产品文档拆分为集合,假设基于Product类可用的字符串属性?

提前谢谢你。

修改 我创建并注册了以下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'作为新raven集合的名称(以及实体类型的名称也保存为EntityData对象上的单独字段)。

我如何回顾我的物品?在执行查询之前,我找不到可以在运行时定义集合的位置。

我是否必须执行一些原始的lucene查询?或者我可以实现一个查询监听器吗?

修改 我找到了一种使用动态定义的集合存储,查询和删除对象的方法,但我不确定这是正确的方法:

文档商店监听器:

(我使用上面定义的类)

解析索引名称的方法:

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);
}

我觉得它变得有点脏,但这是在指定集合名称运行时存储/查询/删除的方式吗?或者我这样陷入困境?

1 个答案:

答案 0 :(得分:3)

斯蒂芬, 您可以使用以下命令提供用于决定集合名称的逻辑:

 store.Conventions.FindTypeTagName

使用泛型类型静态处理。 如果您想在运行时做出决定,可以使用DocumentStoreListner

提供