1

私は RavenDB を初めて使用し、以下のインデックスを使用して以下のドキュメント モデルをクエリしようとしています。インデックスはほぼ希望どおりに機能していますが、現在は、日付の最新のステータスのみを合計に含める必要があります。たとえば、クライアントは 1 つの日付に対して複数のインポート ステータスを持つことができますが、結果の合計では最後のステータスのみをカウントする必要があります。

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

これらのいずれも、クライアントごとに 1 つのステータスのみをインデックス化します。代わりに、複数のステータスが必要で、特定の日付の最後のステータスのみが必要な場合は、次のようにすることができます。

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 に答える