我有一个名为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 属性,因此 aSession.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 时看到这一点。
这不起作用,因为(如 DB 的 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 的帖子”。当数据库应该已经有这样的索引时,我讨厌为 Id 定义索引。