Mongodb 在嵌套文档上使用mongo映射Reduce
我的文件结构如下:Mongodb 在嵌套文档上使用mongo映射Reduce,mongodb,mapreduce,Mongodb,Mapreduce,我的文件结构如下: { "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
{
"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\u id、cities.city\u id、regions\u region\u id,我想我可以使用map/reduce实现这一点
对于给定的结构,这可能吗
也许有人能给我指出正确的地图/缩略方向。Mongo地图缩略示例可以在这里找到: 每个唯一国家/地区id、城市id和地区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 }
似乎区域应该是一个数组
"regions" : [{
"region_id" : 796,
"region_name" : "Australien: New South Wales (Sydney)"
}]
“我要计算国家/地区id,…”
似乎您需要此输出
...
{_id: 328, cities: 6, regions: 1},
{_id: 329, cities: 10, regions: 4},
...
尝试以下方法,注意它只能对cities数组求和
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" } } }
)
为什么要使用map/reduce?使用聚合框架会更直接(更快),我认为这在聚合框架中是不可能的。您是否有上述数据结构的示例?