基于ID的RavenDB查询

基于ID的RavenDB查询,ravendb,Ravendb,我有一个名为Post的模型,它有一个名为Slug的字段。我已经用属性[ID]标记了此字段,并更改了RavenDB中的FindIdentityProperty约定,以便它将标记有[ID]的属性视为文档的标识 现在,我想获取所有具有以字符G开头的段塞的帖子,是否需要创建如下索引: from Post in docs.Posts select new { Slug = Post.Slug } 还是像这样 from Post in docs.Posts select new { Id = Post.I

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

现在,我想获取所有具有以字符G开头的段塞的帖子,是否需要创建如下索引:

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(“SomeID”)

第一个选项可以在C#中的代码中定义为AbstractIndexCreationTask,因为C#知道Slug是一个Post字段,但不起作用,因为它是一个“字符串”,并像下面这样被定义到RavenDB中:(当创建索引时)

变成

docs.Posts
    .Select(Post => new {Slug = Post.Slug })
创建索引后,在SL-UI中查看时可以看到这一点

这不起作用,因为(如DB的SL-UI所示)Post的JSON表示形式没有像
“Slug”:“Some Slug”
这样的名称-值对。因为它是ID,所以它显示在文档上方,@metadata中它可以被视为\u document\u ID的值

后者确实有效,但仅当定义为字符串时,如C中所示#

我怀疑当Raven得到包含字符串“Id”的查询时,它会自动将其视为是对[@metadata][\u document\u Id]的查询


这里没有LINQ的优点-看起来非常脆弱,无法通过域名重构Id不是一个Post字段,但是这个索引确实允许我做我想做的事情,即“获取所有包含以字符G开头的slug的Post”。我讨厌为ID定义索引,因为DB应该已经有了这样一个索引。

Hm,我们实际上在AbstractIndexCreationTask中也使用了相同的约定,所以这应该是可行的。
无论如何,文档的id总是可以使用uu document_id

访问,所以您也在使用第二个选项,您认为我创建Post_ByID是明智的吗?我必须为Post、Passphrase和其他一些域的id创建索引。任何决定使用属性(注释)将属性标记为ID并更改FindIdentityConvention的人都将面临与我相同的问题,像Post_BySlug这样的索引将不起作用。
docs.Posts
    .Select(Post => new {Slug = Post.Slug })
public class Post_ById : AbstractIndexCreationTask
    {
        public override IndexDefinition CreateIndexDefinition()
        {
            return new IndexDefinition
                       {
                           Map = "from Post in docs.Posts select new { Id = Post.Id}"
                       };
        }
    }