RavenDB 查询元数据
RavenDB querying metadata
我想防止项目中的文档被删除,因此我决定使用元数据将文档标记为已存档。我使用下面的代码来做到这一点:
public class DeleteDocumentListener : IDocumentDeleteListener
{
public void BeforeDelete(string key, object entityInstance, RavenJObject metadata)
{
metadata.Add("Archived", true);
throw new NotSupportedException();
}
}
之后,我想将查询更改为 return 只有存档元数据值设置为 false 的文档:
using (var session = _store.OpenSession())
{
var query = session.Advanced.DocumentQuery<Cutter>()
.WhereEquals("@metadata.Archived", false);
}
不幸的是这个查询 return 空结果集。如果 Document 没有此元数据 属性,则上述条件会被视为 false。这不是我所期望的。
如何向 return 没有元数据 属性 或此 属性 有一定价值的文档编写查询?
您可以通过为您的 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);
我想防止项目中的文档被删除,因此我决定使用元数据将文档标记为已存档。我使用下面的代码来做到这一点:
public class DeleteDocumentListener : IDocumentDeleteListener
{
public void BeforeDelete(string key, object entityInstance, RavenJObject metadata)
{
metadata.Add("Archived", true);
throw new NotSupportedException();
}
}
之后,我想将查询更改为 return 只有存档元数据值设置为 false 的文档:
using (var session = _store.OpenSession())
{
var query = session.Advanced.DocumentQuery<Cutter>()
.WhereEquals("@metadata.Archived", false);
}
不幸的是这个查询 return 空结果集。如果 Document 没有此元数据 属性,则上述条件会被视为 false。这不是我所期望的。
如何向 return 没有元数据 属性 或此 属性 有一定价值的文档编写查询?
您可以通过为您的 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);