我认为,如果你需要规范化的数据表-你需要尝试一些其他的数据库解决方案。
但是我在Git上找到了MOngo的解决方案
顺便说一下,在插入代码-它有电影的名称,但没有电影的ID。
问题
你有一个演员集合和他们所做的电影数组。
您希望生成一个Movies集合,每个Movies中都包含一个actor数组。
一些示例数据
db.actors.insert( { actor: "Richard Gere", movies: ['Pretty Woman', 'Runaway Bride', 'Chicago'] });
db.actors.insert( { actor: "Julia Roberts", movies: ['Pretty Woman', 'Runaway Bride', 'Erin Brockovich'] });
解决方案
我们需要循环遍历Actor文档中的每个电影,并分别发出每个电影。
这里的问题是在减少阶段。我们不能从reduce阶段发出一个数组,因此必须在返回的“value”文档中构建一个Actors数组。
The code
map = function() {
for(var i in this.movies){
key = { movie: this.movies[i] };
value = { actors: [ this.actor ] };
emit(key, value);
}
}
reduce = function(key, values) {
actor_list = { actors: [] };
for(var i in values) {
actor_list.actors = values[i].actors.concat(actor_list.actors);
}
return actor_list;
}
注意,actor_list实际上是一个包含数组的javascript对象。还要注意map发出相同的结构。
执行以下命令执行map / reduce,将其输出到“pivot”集合并打印结果:
printjson (db.actors。mapReduce(map, reduce, "pivot"));
db.pivot.find () .forEach (printjson);
以下是输出示例,请注意《风月俏佳人》和《逃跑新娘》中都有“理查德·基尔”和“茱莉亚·罗伯茨”。
{ "_id" : { "movie" : "Chicago" }, "value" : { "actors" : [ "Richard Gere" ] } }
{ "_id" : { "movie" : "Erin Brockovich" }, "value" : { "actors" : [ "Julia Roberts" ] } }
{ "_id" : { "movie" : "Pretty Woman" }, "value" : { "actors" : [ "Richard Gere", "Julia Roberts" ] } }
{ "_id" : { "movie" : "Runaway Bride" }, "value" : { "actors" : [ "Richard Gere", "Julia Roberts" ] } }