2012-03-06 57 views
2

我有一個City文檔,Site文檔。城市可以有多個網站。場地文件中包含城市信息。大約有100個城市的文件和RavenDB 10000個站點文檔RavenDB - 篩選文件並使用索引查詢計數

市文檔:

{ 
    "CityCode": "NY", 

    "CityName": "New York" 
} 

站點文檔:

{ 
    "SiteName": "MOMA", 

    "CityCode": "NY" 
} 

目的是讓所有城市的列表和網站數量對於每個像...

City Sites 
NY  12 
CH  33 
BO  56 
and so on.... 

我正在這樣做。

int countSites = session.Query<Site>() 
         .Count(); 


var SiteCityList = session.Query<Site>() 
          .Take(countSites) 
          .ToList() 
          .GroupBy(x => x.CityCode) 
          .OrderBy(x => x.Count()) 
          .ToDictionary(x => x.Key, x => x.Count()); 

這並不能提供ravendb中的所有數據。我在任何時候只通過網站獲得11行計數,甚至計數也不準確。我想要的是將每個城市的100個城市和網站數量(以100爲單位)列爲上面列出的列表。謝謝您的幫助。

回答

3

使用的map/reduce指數這樣

public class CityCodeCount : AbstractIndexCreationTask<Site, CityCodeCount.ReduceResult> 
{ 
    public class ReduceResult 
    { 
     public string CityCode { get; set; } 
     public int Count { get; set; } 
    } 

    public CityCodeCount() 
    { 
     Map = sites => from site in sites 
         select new 
         { 
          site.CityCode, 
          Count = 1 
         }; 

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

    } 
} 

後來那麼,你可以很容易地查詢。

var results = documentSession.Query<CityCodeCount.ReduceResult, CityCodeCount>() 
    .ToList(); 
2

如果你想要一個替代方法,你可以看看Faceted Search

它給你比的Map/Reduce稍微更大的靈活性,但是當你想要的項目數只會工作(你在你的情況下)。