3

Slugというフィールドを持つPostというモデルがあります。このフィールドを属性 [ID] でマークし、RavenDB の FindIdentityProperty 規則を変更して、[ID] でマークされたプロパティをドキュメントの ID と見なすようにしました。

今、文字 G で始まるスラッグを持つすべての投稿を取得したいのですが、次のようなインデックスを作成する必要がありますか?

from Post in docs.Posts
select new { Slug = Post.Slug }

またはこのように

from Post in docs.Posts
select new { Id = Post.Id }

または、ID を照会しているため、RavenDB が内部的に持つべきインデックスを使用しますか。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 で始まるスラッグを持つすべての投稿を取得する」という、私がやりたいことを実行できました。また、DB に既にそのようなインデックスが必要な場合に、ID のインデックスを定義するのは嫌いです。

4

1 に答える 1

3

うーん、実際には AbstractIndexCreationTask でも同じ規則を使用しているので、うまくいくはずです。いずれにせよ、__document_id を使用してドキュメントの ID にいつでもアクセスできます。

于 2011-04-17T06:07:58.587 に答える