【问题标题】:RavenDB querying metadataRavenDB 查询元数据
【发布时间】:2018-06-26 01:55:46
【问题描述】:

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

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。这不是我所期望的。

如何编写查询以返回没有元数据属性或此属性具有某些值的文档?

【问题讨论】:

    标签: ravendb


    【解决方案1】:

    您可以通过为您的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();
    }
    

    希望这会有所帮助!

    快速旁注。要创建索引,可能需要运行以下代码:

    new ArchivedIndex().Execute(session.Advanced.DocumentStore);
    

    【讨论】:

    • 效果很好,谢谢。我需要为我的项目中的每个实体实施这样的索引是真的吗?是否可以有一个通用索引?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多