我在 RavenDb 中存储了许多命令,它们都实现了 ICommand。我希望能够搜索上次修改的元数据和 Raven-Entity-Name。我目前正在对每个命令执行多重映射,如下所示:
public class CommandAuditSearch_Index : AbstractMultiMapIndexCreationTask<CommandAuditSearch_Index.Results>
{
public class Results
{
public string CommandType { get; set; }
public DateTime LastModified { get; set; }
}
public CommandAuditSearch_Index()
{
AddMap<NewEmployeeStartCommand>(employees => employees.Select(x => new
{
CommandType = MetadataFor(x).Value<string>("Raven-Entity-Name"),
LastModified = MetadataFor(x).Value<DateTime>("Last-Modified")
}));
AddMap<EmployeeLeaverCommand>(employees => employees.Select(x => new
{
CommandType = MetadataFor(x).Value<string>("Raven-Entity-Name"),
LastModified = MetadataFor(x).Value<DateTime>("Last-Modified")
}));
Index(results => results.CommandType, FieldIndexing.Analyzed);
}
}
我查询如下:
session.Query<CommandAuditSearch_Index.Results, CommandAuditSearch_Index>()
.Where(x => x.CommandType == commandType && x.LastModified >= DateTime.Today).OfType<ICommand>().ToList();
我知道 Raven 中已经内置了一个索引来获取标签(实体名称)和上次修改日期,但我似乎无法弄清楚如何获取结果,因为上面的索引给了我。
任何人都可以为我指明静态索引的正确方向,在该索引中,我不必为我必须查询的每个命令提供如上所述的多重映射,从而以 ICommand 列表的形式提供结果吗?
谢谢
稻田
最佳答案
几点:
您不需要将字段标记为已分析,除非您要使用
Search
查询方法进行全文搜索。如果您只是使用Where
,则分析索引项没有任何优势。如果您要在结果中查找元数据值,您只需使用
GetMetadataFor
从元数据而不是文档数据中获取它们。 Reference here .正如您所说,已经有您需要的索引。查询它的最简单方法是使用
LuceneQuery
API。var tag = documentStore.Conventions.GetTypeTagName(theCommand.GetType()); var results = session.Advanced .LuceneQuery<ICommand, RavenDocumentsByEntityName>() .WhereEquals("Tag", tag) .AndAlso() .WhereGreaterThanOrEqual("LastModified", DateTime.Today .ToUniversalTime()) .ToList(); foreach (var result in results) { var md = session.Advanced.GetMetadataFor(result); var entityName = md.Value<string>("Raven-Entity-Name"); var lastModified = md.Value<DateTime>("Last-Modified"); // you can see all the metadata if you like Debug.WriteLine(md.ToString(Formatting.Indented)); }
关于ravendb - 按实体名称和上次修改日期搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15384010/