gpt4 book ai didi

RavenDB 查询元数据

转载 作者:行者123 更新时间:2023-12-02 04:00:29 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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

关于RavenDB 查询元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42151916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com