RavenDB查询ID

时间:2011-04-16 18:52:46

标签: ravendb

我有一个名为帖子的模型,其中有一个名为 Slug 的字段。我已使用属性[ID]标记此字段,并更改了RavenDB中的FindIdentityProperty约定,以便将标记为[ID]的属性视为文档的标识。

现在我想获取所有包含以字符G开头的slug的帖子,是否需要创建这样的索引:

from Post in docs.Posts
select new { Slug = Post.Slug }

或者像这样

from Post in docs.Posts
select new { Id = Post.Id }

或者我使用RavenDB内部应该拥有的索引,因为我正在查询ID。 我知道RavenDB将ID属性索引到某处,以便Session.Load<Post>("SomeID")成为可能。

第一个选项可以在C#中的代码中定义为AbstractIndexCreationTask,因为C#理解Slug是Post的一个字段,但不起作用,因为它是“字符串”,如下所示:RavenDB :(当创建索引时)< / p>

from Post in docs.Posts
select new { Slug = Post.Slug }

变为

docs.Posts
    .Select(Post => new {Slug = Post.Slug })

在创建索引后查看SL-UI时,可以看到这一点。

这样做 NOT 工作因为(如数据库的SL-UI所示)Post的JSON表示,没有像"Slug":"Some-Slug"这样的名称 - 值对。由于它是ID,它在文档上方 ,在@metadata中可以看作是 _document_id 的值

后者确实有效,但只有在定义为字符串时才会起作用,如C#

中所示
public class Post_ById : AbstractIndexCreationTask
    {
        public override IndexDefinition CreateIndexDefinition()
        {
            return new IndexDefinition
                       {
                           Map = "from Post in docs.Posts select new { Id = Post.Id}"
                       };
        }
    }

我怀疑当Raven获取包含字符串“ Id ”的查询时,它会自动将其视为对 [@ metadata] [_ document_id] 的查询。

这里没有LINQ善良 - 看起来非常脆弱,无法在域名的重构中存活下来。 ID 不是Post的一个字段,但是这个索引允许我做我想要的,即“获取所有以字符G 开头的slug的帖子” 。当DB应该已经有这样的索引时,我讨厌为ID定义索引。

1 个答案:

答案 0 :(得分:3)

嗯,我们实际上也在AbstractIndexCreationTask中使用相同的约定,因此应该可行。 无论如何,始终可以使用__document_id

访问文档的ID