我有一个名为帖子的模型,其中有一个名为 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定义索引。
答案 0 :(得分:3)
嗯,我们实际上也在AbstractIndexCreationTask中使用相同的约定,因此应该可行。 无论如何,始终可以使用__document_id
访问文档的ID