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 属性,因此 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 定义索引。

4

1 回答 1

3

嗯,我们实际上在 AbstractIndexCreationTask 中也使用了相同的约定,所以应该可以。无论如何,总是可以使用 __document_id 访问文档的 id

于 2011-04-17T06:07:58.587 回答