Mit map/reduce für die Zuordnung der Eigenschaften in einer Sammlung
Update: follow-up zu MongoDB Erhalten Namen aller Schlüssel in collection.
Wie bereits von Kristina, kann man mit Mongodb 's map/reduce", um die Liste der Schlüssel in einer Sammlung:
db.things.insert( { type : ['dog', 'cat'] } );
db.things.insert( { egg : ['cat'] } );
db.things.insert( { type : [] });
db.things.insert( { hello : [] } );
mr = db.runCommand({"mapreduce" : "things",
"map" : function() {
for (var key in this) { emit(key, null); }
},
"reduce" : function(key, stuff) {
return null;
}})
db[mr.result].distinct("_id")
//output: [ "_id", "egg", "hello", "type" ]
Solange wir wollen nur die Tasten befindet sich auf der ersten Ebene der Tiefe, diese funktioniert einwandfrei. Allerdings wird es nicht abrufen Sie diese Schlüssel, die sich auf tieferen Ebenen. Wenn wir hinzufügen eines neuen Datensatzes:
db.things.insert({foo: {bar: {baaar: true}}})
Und wir laufen wieder den map-reduce +verschiedene snippet oben, erhalten wir:
[ "_id", "egg", "foo", "hello", "type" ]
Aber wir werden nicht die bar und die baaar Tasten, die Ineinander verschachtelt sind unten in der Daten Struktur. Die Frage ist: wie Kriege ich alle Schlüssel, egal, Ihr Niveau der Tiefe? Idealerweise würde ich gerne das Skript zu Fuß nach unten, um alle level von Tiefe und produziert eine Ausgabe wie:
["_id","egg","foo","foo.bar","foo.bar.baaar","hello","type"]
Vielen Dank im Voraus!
- Gibt es trotzdem kann ich alle Tasten (inklusive doppelte)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
OK, das ist ein wenig komplexer, weil Sie brauchen werden, um einige der Rekursion.
Machen die Rekursion passieren, werden Sie brauchen, um in der Lage zu speichern einige Funktionen auf dem server.
Schritt 1: definieren Sie einige Funktionen und setzen Sie für server-side -
Schritt 2: definieren Sie die map-und reduce-Funktionen
Schritt 3: führen Sie die Karte reduzieren und Blick auf die Ergebnisse,
Die Ergebnisse, die Sie erhalten, sind:
Gibt es eine offensichtliche problem hier, fügen wir einige unerwartete Felder hier:
1. die _id Daten
2. die .0 (auf-ei und-Typ)
Schritt 4: Einige mögliche Korrekturen
Für problem #1 der fix ist relativ einfach. Ändern Sie einfach die
map
Funktion. Ändern Sie diese:zu diesem:
Problem #2 ist ein wenig heikel. Sie wollte alle Tasten und technisch "ei.0" ist einen gültigen key. Sie können ändern
m_sub
ignorieren solche numerischen Tasten. Aber es ist auch einfach, um zu sehen, eine situation, wo dieses nach hinten Los. Angenommen, Sie haben eine assoziative Arrays innerhalb von einer regelmäßigen Anordnung, dann wollen Sie, dass "0" angezeigt werden. Ich lasse den rest der Lösung bis zu Ihnen.out
parameter, die nicht existierten zum Zeitpunkt des Schreibens dieses Artikels. Ehrlich gesagt, das Sie wahrscheinlich nicht einmal verwenden wollen, M/R, da kann es wahrscheinlich gemacht werden, das eine viel bessere Aggregation Framework.Mit Toren VP und Kristina Antworten als inspiration habe ich ein open source tool namens Sorte, die tut genau dies: https://github.com/variety/variety
Hoffentlich finden Sie es nützlich zu sein. Lassen Sie mich wissen, wenn Sie Fragen haben, oder irgendwelche Probleme mit es.
als eine einfache Funktion;