OK, hier sind einige Fragen, die helfen können:
Get all field names in einer Sammlung mit Karten reduzieren.
Hier ist a recursive version, die alle möglichen Felder auflistet.
Hoffentlich kann das Ihnen den Anfang machen. Ich vermute jedoch, dass Sie bei dieser Anfrage auf einige Probleme stoßen werden. Es gibt zwei Probleme hier:
- Ich kann eine "gettype" -Funktion für JSON nicht finden. Sie können nach
$type
abfragen, aber es sieht nicht so aus, als könnten Sie tatsächlich eine gettype
Funktion auf einem Feld ausführen und diese Karten zurück zum BSON-Typ haben.
- Ein Feld kann Daten verschiedener Typen enthalten, daher benötigen Sie einen Plan, um damit umzugehen. Selbst wenn es nicht offensichtlich ist Mongo könnte einige Zahlen als Ints speichern und andere schweben, ohne dass Sie es wirklich wissen. In der Tat ist dies mit dem PHP-Treiber durchaus möglich.
Also, wenn Sie davon ausgehen, dass Sie Problem # 1 lösen können, dann sollten Sie in der Lage sein Problem # 2 mit einer leichten Variation auf „Get alle Feldnamen“ zu lösen.
Es wäre wahrscheinlich so etwas wie folgt aussehen:
"map" : function() { for (var key in this) { emit(key, [ typeof value[key] ]); } }
"reduce" : function(key, stuff) { return (key, add_to_set(stuff)); }
Also im Grunde würden Sie die key
emittieren und die type of key value
(als Array) in der Map-Funktion. Dann würden Sie von der Reduce-Funktion eindeutige Einträge für jeden Typ hinzufügen.
Am Ende des Laufes würden Sie Daten wie diese
{"_id":[255], "name" : [1,5,8], ... }
Natürlich ist dies alles eine Menge Arbeit, abhängig von Ihrem aktuellen Problem, können Sie nur sicherstellen wollen (aus Ihr Code), dass Sie immer die richtige Art von Daten eingeben. Das Finden der Art von Daten, nachdem die Daten in der DB sind, ist definitiv ein Schmerz.
Dadurch wird der Typ JS geben, die sich von der BSON Typ unterscheiden. Wenn Sie beispielsweise type db.employee.findOne() ._ id eingeben, erhalten Sie "string", aber der BSON-Typ lautet "Object id". –