2

顧客の約50万のRavenDBドキュメントがあります。プロパティの1つは「City」です。LINQクエリを記述して、各都市のすべての発生のリストとその数を取得するにはどうすればよいですか。たとえば、1,000の顧客ドキュメントに都市の値として「NY」が含まれている場合、NY1000のような数の都市のリストが必要です。LA 200、または1300、BO5000など。

これは私が最初に書いたものです。

 Dictionary<string,int> cityStats = session.Query<Customer>()
                    .ToList()
                    .GroupBy(x => x.City)
                    .OrderBy(x => x.Count())
                    .ToDictionary(x => x.Key, x => x.Count());

しかし、これは正確な結果をもたらすようには見えません。したがって、結果が変更されるかどうかを確認するために、maximum requests permitプロパティ(推奨されないことはわかっています)を変更しました。ただし、maxrequest値を500000に維持すると、同じ結果が得られます。確かに約50万の顧客ドキュメントがあることを知っているので、一致するように合計する必要があります。

4

1 に答える 1

2

これを行うには、map-reduceインデックスが必要です。これは、次のことを示す短いコンソールプログラムです。

using System;
using System.Linq;
using Raven.Client.Document;
using Raven.Client.Indexes;

namespace ConsoleApplication1
{
  public class Customer
  {
    public string Id { get; set; }
    public string Name { get; set; }
    public string City { get; set; }
  }

  public class Customers_ByCity : AbstractIndexCreationTask<Customer, Customers_ByCity.Result>
  {
    public Customers_ByCity()
    {
      Map = customers => from customer in customers
                         select new
                         {
                           customer.City,
                           Count = 1
                         };

      Reduce = results => from result in results
                          group result by result.City
                          into g
                          select new
                          {
                            City = g.Key,
                            Count = g.Sum(x => x.Count)
                          };
    }

    public class Result
    {
      public string City { get; set; }
      public int Count { get; set; }
    }
  }

  class Program
  {
    private static void Main()
    {
      var documentStore = new DocumentStore { Url = "http://localhost:8080" };
      documentStore.Initialize();
      IndexCreation.CreateIndexes(typeof(Program).Assembly, documentStore);

      using (var session = documentStore.OpenSession())
      {
        session.Store(new Customer { Name = "John", City = "NY" });
        session.Store(new Customer { Name = "Jane", City = "NY" });
        session.Store(new Customer { Name = "Jim", City = "NY" });
        session.Store(new Customer { Name = "Sally", City = "LA" });
        session.Store(new Customer { Name = "Sam", City = "LA" });
        session.Store(new Customer { Name = "Suzie", City = "LA" });
        session.Store(new Customer { Name = "Sarah", City = "LA" });

        session.SaveChanges();
      }

      using (var session = documentStore.OpenSession())
      {
        // In a real app, you probably don't want to wait for nonstale results.
        // You will also want to consider what to do if you have more than one page of results (more than 1024 cities)

        var counts = session.Query<Customers_ByCity.Result, Customers_ByCity>()
          .Customize(x=> x.WaitForNonStaleResults())
          .Take(1024);

        foreach (var result in counts)
        {
          Console.WriteLine("{0}: {1}", result.City, result.Count);
        }

        Console.WriteLine();
      }
      Console.ReadLine();
    }
  }
}
于 2012-09-26T18:43:38.983 に答える