Ravendb:map-reduce在两个相关的文件上

时间:2014-11-06 16:50:54

标签: mapreduce ravendb

在我的ravendb中,我有2个文件:国家和城市

城市文档看起来像这样 ID 名称 CountryId

国家/地区文档如下所示 ID 名称

目前我有一个索引,我将所有城市作为列表检索,这是有效的。 但我宁愿想要检索按国家分组的所有城市 这就是我所拥有的

 public class City_ByCountry
    {
        public string CityId { get; set; }
        public string CityName { get; set; }
        public string CountryName { get; set; }
    }

Map = (city => from cit in city
                            let cou = LoadDocument<Country>(cit.CountryId)
                            select new City_ByCountry
                            {
                                CityId = cit.Id,
                                CityName = cit.Name,
                                CountryName = cou.Name
                            });

这有效但给我一个所有城市的列表(id,name,countryName)

但我想要一个像这样的列表

CountryName [    列出城市]

CountryName [    列出城市]

我可以通过减少结果来做到这一点吗?或者这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

我认为通过减少这是可能的。有关如何执行高级索引的信息,请参阅Ayende的帖子Awesome indexing with RavenDB

我试图修改Ayende的例子来满足你的需求(只是在记事本上,所以我不知道它是否编译):

public class City_ByCountry : AbstractIndexCreationTask<City, City_ByCountry.ReduceResult>
{
    public class ReduceResult
    {
        public string CountryId { get; set; }
        public string CountryName { get; set; }
        public City[] Cities { get; set; }
    }

    public City_ByCountry()
    {
        Map = cities =>
                from city in cities
                select new
                    {
                        CountryId= city.CountryId,
                        CountryName = LoadDocument<Country>(city.CountryId),
                        Cities = new [] { city }
                    };
        Reduce = cities =>
                from city in cities
                group city by city.CountryId
                into g
                select new
                    {
                        CountryId = g.Key,
                        CountryName = g.First().CountryName,
                        Cities = g.SelectMany(x => x.Cities)
                    };
    }
}