2013-05-01 63 views
2

我有以下的文档结构:地图与蒙戈减少对嵌套文件

{ 
    "country_id" : 328, 
    "country_name" : "Australien", 
    "cities" : [{ 
     "city_id" : 19398, 
     "city_name" : "Bondi Beach (Sydney)" 
    }, { 
     "city_id" : 31102, 
     "city_name" : "Double Bay (Sydney)" 
    }, { 
     "city_id" : 31101, 
     "city_name" : "Rushcutters Bay (Sydney)" 
    }, { 
     "city_id" : 817, 
     "city_name" : "Sydney" 
    }, { 
     "city_id" : 31022, 
     "city_name" : "Wolly Creek (Sydney)" 
    }, { 
     "city_id" : 18851, 
     "city_name" : "Woollahra" 
    }], 
    "regions" : { 
    "region_id" : 796, 
    "region_name" : "Australien: New South Wales (Sydney)" 
    } 
} 

的琢面导航我要算的属性COUNTRY_ID,cities.city_id,regions_region_id我想我可以用地图的操作/减少。

这是可能与给定的结构?

也许有人可以指出我在正确的地图/减少方向。

+0

为什么要使用map/reduce?这对于聚合框架来说会更直接(并且更快)。 – 2013-05-05 07:32:09

+0

我认为这是不可能的聚合框架。你有没有上面的数据结构的例子? – MadeOfSport 2013-05-06 09:04:20

回答

2

蒙戈的map-reduce的例子可以在这里找到:http://docs.mongodb.org/manual/tutorial/map-reduce-examples/

的每一个独特的COUNTRY_ID,city_id和REGION_ID元组文档的数量很简单:

> function m() { 
    for(var i in this.cities) {  
     emit({country_id:this.country_id, 
       city_id:this.cities[i].city_id, 
       region_id:this.regions.region_id}, 
       1); 
    } } 



> function r(id,docs) { 
     return Array.sum(docs); 
} 
> db.loc.mapReduce(m,r,{out:"map_reduce_out"}) 
{ 
    "result" : "map_reduce_out", 
    "timeMillis" : 5, 
    "counts" : { 
     "input" : 1, 
     "emit" : 6, 
     "reduce" : 0, 
     "output" : 6 
    }, 
    "ok" : 1, 
} 
> db.map_reduce_out.find() 
{ "_id" : { "country_id" : 328, "city_id" : 817, "region_id" : 796 }, "value" : 1 } 
{ "_id" : { "country_id" : 328, "city_id" : 18851, "region_id" : 796 }, "value" : 1 } 
{ "_id" : { "country_id" : 328, "city_id" : 19398, "region_id" : 796 }, "value" : 1 } 
{ "_id" : { "country_id" : 328, "city_id" : 31022, "region_id" : 796 }, "value" : 1 } 
{ "_id" : { "country_id" : 328, "city_id" : 31101, "region_id" : 796 }, "value" : 1 } 
{ "_id" : { "country_id" : 328, "city_id" : 31102, "region_id" : 796 }, "value" : 1 } 
0

似乎地区应该是一个阵列

"regions" : [{ 
    "region_id" : 796, 
    "region_name" : "Australien: New South Wales (Sydney)" 
    }] 

“我想计算属性COUNTRY_ID,...”

看来你想要这个输出。

... 
{_id: 328, cities: 6, regions: 1}, 
{_id: 329, cities: 10, regions: 4}, 
... 

尝试试验以下内容,注意它只会求和城市数组。

db.Country.aggregate(
    { $unwind : "$regions" }, {'$group': {'_id': '$country_id' , 'cities' : { $sum : 1} } } 
) 

以下将提供与接受的答案类似的输出。

db.Country.aggregate(
{'$group': {'_id': '$country_id' , 'cities' : { $push: "$cities.city_id" }, 'regions' : { $push: "$regions.region_id" } } } 
)