RavenDB查询元数据

RavenDB查询元数据,ravendb,Ravendb,我想防止在我的项目中删除文档,我决定使用元数据将文档标记为已存档。我使用以下代码来实现这一点: public class DeleteDocumentListener : IDocumentDeleteListener { public void BeforeDelete(string key, object entityInstance, RavenJObject metadata) { metadata.Add("Archived", true);

我想防止在我的项目中删除文档,我决定使用元数据将文档标记为已存档。我使用以下代码来实现这一点:

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);
}
使用(var session=\u store.OpenSession())
{
var query=session.Advanced.DocumentQuery()
.WhereEquals(“@metadata.archive”,false);
}
不幸的是,此查询返回空结果集。若文档不具有此元数据属性,则上述条件将被视为false。这不是我所期望的


我如何组合查询以返回没有元数据属性或此属性有某些值的文档?

您可以通过为您的
文档创建索引来解决此问题,然后根据该索引进行查询:

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();
}
new ArchivedIndex().Execute(session.Advanced.DocumentStore);