首页 文章

RavenDB查询ID

提问于
浏览
3

我有一个名为 Post 的模型,它有一个名为 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 :(当创建索引时)

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 回答

  • 3

    嗯,我们实际上也在AbstractIndexCreationTask中使用相同的约定,所以这应该工作 . 无论如何,始终可以使用__document_id访问文档的ID

相关问题