【问题标题】:RavenDB Index created incorrectlyRavenDB 索引创建不正确
【发布时间】:2012-12-05 00:29:58
【问题描述】:

我在 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};
    }
}

在索引中,它在“地图”字段中被翻译为:

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

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

如果将 Maps 字段手动更改为下面的代码,它可以工作...

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

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

使用的 RavenDB:RavenHQ,内部版本 #961

更新:

我正在做的事情如下:我想将 SharePoint 用作 CMS,并将 RavenDB 用作 SharePoint 列表数据的现成副本。我创建了一个从 SharePoint 列表同步到 RavenDB 的工具。我有一个从 SharePoint 列表项创建并序列化到 RavenDB 的通用类型 Item。所以我所有的文档都是 Item 类型的。但它们来自具有不同属性的不同列表,所以我希望能够区分。您建议区分其他属性,这将非常有效。但随后我会在一个大的 Items 集合中看到所有列表中的所有列表项......您认为解决这个问题的最佳方法是什么?还是只是忍受它?我想使用索引来创建从项目中的所有数据到我需要的实际数据的投影。

【问题讨论】:

    标签: ravendb


    【解决方案1】:

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

    您可以通过为DocumentStore.Conventions.FindTypeTagName 分配一个新函数来提供您自己的自定义约定 - 但对每个实体都这样做可能会很麻烦。您可以创建一个自定义属性以应用于您的实体,然后编写函数来查找和理解该属性。

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

    关于为什么索引的变化有效 - 这不是因为 linq 语法的切换。这是因为您说的是from doc in docs 而不是from doc in docs.Items。您可能已经完成 from doc in docs.Doelkaartens 而不是使用 where 子句。它们是等价的。更多示例请参见this page in the docs。

    【讨论】:

    • 嗨,马特,感谢您的回答。我的评论太长了,无法进一步解释我的问题。现在作为问题的更新。有什么最佳方法的想法吗?
    • 查看文档中查询多态实体的页面。它应该回答你的问题。 ravendb.net/docs/client-api/querying/polymorphism
    • 我决定制作所有类型为 Item 的项目,并且不要与 Raven-Entity-Name 混淆。多态性对我不起作用,没有继承...感谢您的时间!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2019-12-15
    • 1970-01-01
    相关资源
    最近更新 更多