Я думаю, если вам нужны нормализованные таблицы данных - вам нужно попробовать другие решения для баз данных.
Но я основал это решение для MOngo на Git
Кстати, во вставках код - у него есть название фильма, , но идентификатор фильма noi .
Проблема
У вас есть коллекция актеров с массивом фильмов, которые они сняли.
Вы хотите создать коллекцию фильмов с массивом актеров в каждом.
Некоторые примеры данных
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 и создать каждый фильм отдельно.
Улов здесь находится в фазе уменьшения. Мы не можем создать массив из фазы сокращения, поэтому мы должны построить массив Actors внутри возвращаемого документа «value».
Код
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, который содержит массив. Также обратите внимание, что карта испускает ту же структуру.
Запустите следующую команду, чтобы выполнить отображение / уменьшение, вывести ее в коллекцию "pivot" и распечатать результат:
printjson (db.actors.mapReduce (map, lower, "pivot"));
db.pivot.find () Foreach (printjson).
Вот пример выходных данных, обратите внимание, что в «Pretty Woman» и «Runaway Bride» есть и «Richard Gere», и «Julia Roberts».
{ "_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" ] } }