2017-02-10 9 views
0

プロジェクトで文書が削除されないようにしたいのですが、メタデータを使用して文書を「アーカイブ済み」としてマークすることにしました。私はそれを行うためのコードの下に使用:RavenDBはメタデータを照会します

public class DeleteDocumentListener : IDocumentDeleteListener 
{ 
    public void BeforeDelete(string key, object entityInstance, RavenJObject metadata) 
    { 
     metadata.Add("Archived", true); 
     throw new NotSupportedException(); 
    } 
} 

その後、私はfalseに設定されたメタデータ値をアーカイブした文書のみを返すようにクエリを変更したい:

using (var session = _store.OpenSession()) 
{ 
    var query = session.Advanced.DocumentQuery<Cutter>() 
       .WhereEquals("@metadata.Archived", false); 
} 

残念ながら、このクエリは、空の結果セットを返します。 Documentにこのメタデータプロパティがない場合、上記の条件はfalseとして扱われます。私が期待していたものではありませんでした。

メタデータプロパティを持たない、またはこのプロパティに値があるドキュメントを返すクエリを作成するにはどうすればよいですか?

答えて

3

あなたCutterドキュメントのインデックスを作成することによってそれを解決してから、そのに対してクエリを実行することができます

public class ArchivedIndex : AbstractIndexCreationTask<Cutter> 
{ 
    public class QueryModel 
    { 
     public bool Archived { get; set; } 
    } 

    public ArchivedIndex() 
    { 
     Map = documents => from doc in documents 
      select new QueryModel 
      { 
       Archived = MetadataFor(doc)["Archived"] != null && MetadataFor(doc).Value<bool>("Archived") 
      }; 
    } 
} 

次に、このようにそれを照会:

using (var session = documentStore.OpenSession()) 
{ 
    var cutters = session.Query<ArchivedIndex.QueryModel, ArchivedIndex>() 
     .Where(x => x.Archived == false) 
     .OfType<Cutter>() 
     .ToList(); 
} 

・ホープ、このことができます!

+0

非常にうまくいった、ありがとう。私がプロジェクトに持っている各エンティティに対してこのようなインデックスを実装する必要があるのは本当ですか? 1つの汎用インデックスを持つことは可能ですか? –

関連する問題