RavenDB索引返回最近的条目

本文关键字:最近 索引 返回 RavenDB | 更新日期: 2023-09-27 18:07:21

我是RavenDB的新手,我正试图用下面的索引查询下面的文档模型。索引几乎按预期工作,除了现在我只需要在总数中包含日期的最近状态。例如,对于一个日期,客户端可以有多个导入状态,但是只有最后一个状态应该被计算在结果总数中。

public class Client
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<ImportStatusMessage> ImportStatuses { get; set; }
}
public class ImportStatusMessage
{
    public DateTime TimeStamp { get; set; }
    public ImportStatus Status { get; set; }
}
public enum ImportStatus
{
    Complete,
    Running,
    Failed,
    Waiting,
    NoReport
}

我使用以下索引:

public class Client_ImportSummaryByDate : AbstractIndexCreationTask<Client, ImportSummary>
{
    public Client_ImportSummaryByDate()
    {
        Map = clients => from client in clients
                       from status in client.ImportStatuses
                       select new
                           {
                               status.Status,
                               Date = status.TimeStamp.Date,
                               Count = 1
                           };
        Reduce = results => from result in results
                            group result by new { result.Status, result.Date }
                            into g
                            select new
                                {
                                    g.Key.Status,
                                    g.Key.Date,
                                    Count = g.Sum(x => x.Count)
                                };
    }
}
public class ImportSummary
{
    public ImportStatus Status { get; set; }
    public DateTime Date { get; set; }
    public int Count { get; set; }
}

可以用索引来完成吗?我是否需要一种不同的方法来解决这个问题?

RavenDB索引返回最近的条目

而不是:

from status in client.ImportStatuses

考虑:

let status = client.ImportStatuses.Last()

如果它们在列表中顺序颠倒,您可以这样做:

let status = client.ImportStatuses.OrderBy(x => x.TimeStamp).Last()

你也可以用First代替Last,如果它们是这样排列的。

这些方法中的任何一个都只能索引每个客户端的单个状态。相反,如果您想要多个状态,但只需要给定日期的最后一个状态,则可以这样做:

Map = clients => clients.SelectMany(x => x.ImportStatuses, (x, y) => new {x.Id, y.Status, y.TimeStamp})
                        .GroupBy(x => new {x.Id, x.TimeStamp.Date})
                        .Select(g => g.OrderBy(x => x.TimeStamp).Last())
                        .Select(x => new
                                     {
                                         x.Status,
                                         x.TimeStamp.Date,
                                         Count = 1
                                     });

所有这些都将在索引的map部分,因为列表在每个文档中都是自包含的。