ravendb - 按实体名称和上次修改日期搜索

标签 ravendb

我在 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/

相关文章:

database - 如果我没有任何文档,我无法在 ravendb 中创建一个集合

nosql - RavenDB-查询问题-过时的结果/索引

mapreduce - RavenDB 映射减少,减少中的重复条目

asp.net-mvc-3 - 使用存储库模型的 MVC3 和 Ninject 每个请求的 RavenDB session

asp.net-mvc-3 - Azure 网站上的 RavenDb - 访问被拒绝

ravendb - 如何创建 RavenDB 资源管理器?

ravendb - 恢复 RavenDb 备份

c# - (嵌入式)Raven Studio 和我现有的 MVC 4 路由不能一起工作?

asp.net-mvc - 嵌入式 RavenDB 和 MVC 是否可行?

ravendb - 将 RavenDB 作为 EmbeddableDocumentStore 运行并访问 RavenDB Management Studio