Ich denke, wenn Sie normalisierte Datentabellen benötigen, müssen Sie andere Datenbanklösungen ausprobieren.
Aber ich habe die Lösung für MOngo gefunden auf Git Übrigens, im Einfügecode steht der Name des Films, aber noi Film's ID .
Problem
Sie haben eine Sammlung von Schauspielern mit einer Reihe von Filmen, die sie gemacht haben.
Sie möchten eine Sammlung von Filmen mit einem Array von Schauspielern in jedem Film erstellen.
Einige Beispieldaten
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'] });
Lösung
Wir müssen eine Schleife durch jeden Film im Actor-Dokument ziehen und jeden Film einzeln ausgeben.
Der Haken an der Sache ist die Phase des Reduzierens. Wir können kein Array aus der Reduzierungsphase ausgeben, also müssen wir ein Actors-Array innerhalb des zurückgegebenen "Wert"-Dokuments erstellen.
Der 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;
}
Beachten Sie, wie actor_list ist eigentlich ein Javascript-Objekt, das ein Array enthält. Beachten Sie auch, dass map die gleiche Struktur ausgibt.
Führen Sie Folgendes aus, um die Map/Reduction auszuführen, sie in der Pivot-Sammlung auszugeben und das Ergebnis zu drucken:
printjson(db.actors.mapReduce(map, reduce, "pivot")); db.pivot.find().forEach(printjson);
Beachten Sie, dass "Pretty Woman" und "Runaway Bride" sowohl "Richard Gere" als auch "Julia Roberts" enthalten.
{ "_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" ] } }
67 Stimmen
Die letzte Antwort auf diese Frage ist wahrscheinlich die wichtigste, da MongoDB 3.2+ eine Join-Lösung namens $lookup implementiert hat. Ich dachte, ich würde sie hier einfügen, weil vielleicht nicht jeder bis zum Ende liest. stackoverflow.com/a/33511166/2593330
10 Stimmen
Richtig, $Nachschlag wurde in MongoDB 3.2 eingeführt. Einzelheiten finden Sie unter docs.mongodb.org/master/reference/operator/aggregation/lookup/
0 Stimmen
Konvertieren Sie eine beliebige Abfrage in Mongo und prüfen Sie die Antwort: stackoverflow.com/questions/68155715/
2 Stimmen
Ich glaube, die ursprüngliche Absicht von NoSQL war, dass man Daten so speichert, wie man sie abrufen möchte. Also speichern Sie sie auf diese Weise und rufen Sie sie auf diese Weise ab