1

我是 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; }
}

这可以通过索引来完成吗?我需要不同的方法来解决这个问题吗?

4

1 回答 1

1

代替:

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
                                     });

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

于 2013-04-03T21:00:57.403 回答