首页 文章

RavenDB索引创建错误

提问于
浏览
2

我在RavenDB中有一个看起来像的文档:

{
    "ItemId": 1,
    "Title": "Villa
}

使用以下元数据:

Raven-Clr-Type: MyNamespace.Item, MyNamespace
Raven-Entity-Name: Doelkaarten

所以我使用MyNamespace.Item类型序列化,但给它自己的Raven-Entity-Name,因此它获得了自己的集合 .

在我的代码中我定义了一个索引:

public class DoelkaartenIndex : AbstractIndexCreationTask<Item>
{
    public DoelkaartenIndex()
    {
        // MetadataFor(doc)["Raven-Entity-Name"].ToString() == "Doelkaarten"
        Map = items => from item in items
                       where MetadataFor(item)["Raven-Entity-Name"].ToString() == "Doelkaarten"
                       select new {Id = item.ItemId, Name = item.Title};
    }
}

在索引中,它在“ Map ”字段中翻译为:

docs.Items
.Where(item => item["@metadata"]["Raven-Entity-Name"].ToString() == "Doelkaarten")
.Select(item => new {Id = item.ItemId, Name = item.Title})

对索引的查询永远不会给出结果 .

如果手动将 Map 字段更改为下面的代码,则可以使用...

from doc in docs
where doc["@metadata"]["Raven-Entity-Name"] == "Doelkaarten"
select new { Id = doc.ItemId, Name=doc.Title };

如何在代码中定义提供所需结果的索引?

RavenDB使用:RavenHQ,Build#961

更新:

我正在做的是:我想使用SharePoint作为CMS,并使用RavenDB作为SharePoint列表数据的只做复制 . 我创建了一个从SharePoint列表同步到RavenDB的工具 . 我有一个泛型类型的项目,我从SharePoint列表项创建,我序列化到RavenDB . 所以我的所有文档都是Item类型 . 但它们来自具有不同属性的不同列表,因此我希望能够区分 . 你建议区分一个额外的 property ,这将是完美的工作 . 但是我会在一个大项目集合中看到所有列表中的所有列表项目......您认为哪个是解决此问题的最佳方法?或者只是忍受它?我想使用索引从Item中的所有数据创建投影到我需要的实际数据 .

1 回答

  • 1

    您无法通过这种方式轻松更改集合的名称 . 服务器端将使用Raven-Entity-Name元数据,但客户端将通过在文档存储中注册的约定来确定集合名称 . 默认约定是使用实体的类型名称 .

    您可以通过为 DocumentStore.Conventions.FindTypeTagName 分配新功能来提供自己的自定义约定 - 但是对每个实体执行此操作可能会很麻烦 . 您可以创建一个自定义属性以应用于您的实体,然后编写该函数以查找并理解该属性 .

    真正最简单的方法就是调用你的实体 Doelkaarten 而不是 Item .

    关于为什么索引的变化有效 - 它's not because of the switch in linq syntax. It'因为你说的是 from doc in docs 而不是 from doc in docs.Items . 您可能已经完成 from doc in docs.Doelkaartens 而不是使用where子句 . 它们是等价的 . 有关更多示例,请参见this page in the docs .

相关问题