Gibt den tatsächlichen Typ eines Feldes in MongoDB zurück

10

In MongoDB, mit $type , ist es möglich, eine Suche basierend darauf zu filtern, ob das Feld mit einem BSON-Datentyp übereinstimmt (siehe DOCS ).

Für zB.

%Vor%

was zurückgibt:

%Vor%

Ich brauche eine Abfrage, die mir den tatsächlichen Feldtyp für jedes Feld in einer Sammlung angibt. Ist das mit MongoDB möglich?

    
nikcub 08.07.2010, 22:41
quelle

4 Antworten

6

OK, hier sind einige verwandte Fragen, die helfen können:

Ermitteln Sie alle Feldnamen mithilfe von Map-Reduce in einer Sammlung.

Hier ist eine rekursive Version , die alle möglichen Felder auflistet.

Hoffentlich können Sie damit beginnen. Ich vermute jedoch, dass Sie bei dieser Anfrage auf einige Probleme stoßen werden. Hier gibt es zwei Probleme:

  1. Ich kann keine "gettype" -Funktion für JSON finden. Sie können nach $type abfragen, aber es sieht nicht so aus, als könnten Sie tatsächlich eine gettype -Funktion für ein Feld ausführen und diese Maps zurück zum BSON-Typ haben.
  2. Ein Feld kann Daten verschiedener Typen enthalten. Daher benötigen Sie einen Plan, um dies zu handhaben. 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.

Wenn Sie also davon ausgehen, dass Sie Problem Nr. 1 lösen können, dann sollten Sie Problem Nr. 2 mit einer kleinen Variation von "Get all field names" lösen können.

Es würde wahrscheinlich in etwa so aussehen:

%Vor%

Sie würden also im Grunde das key und das type of key value (als Array) in der Map-Funktion ausgeben. Dann würden Sie von der Reduce-Funktion eindeutige Einträge für jeden Typ hinzufügen.

Am Ende des Laufs hätten Sie solche Daten

{"_id":[255], "name" : [1,5,8], ... }

Natürlich ist das alles eine Menge Arbeit, abhängig von Ihrem tatsächlichen Problem, Sie möchten vielleicht nur sicherstellen (aus Ihrem Code), dass Sie immer die richtige Art von Daten eingeben. Die Art der Daten zu finden, nachdem die Daten in der DB sind, ist definitiv ein Problem.

    
Gates VP 09.07.2010, 04:39
quelle
7

Geben Sie die folgende Abfrage in die Mongo-Shell ein

%Vor%

Syntax

%Vor%     
Bharathiraja 23.06.2014 14:52
quelle
7

Ab MongoDB 3.4 können Sie den Aggregationsoperator $type zurückgeben der Typ eines Feldes.

%Vor%

was ergibt:

%Vor%     
styvane 26.06.2016 14:10
quelle
0

Beachten Sie, dass a=5;a.constructor.toString() druckt function Number() { [native code] } , kann man etwas ähnliches tun:

db.collection.mapReduce(function() { emit(this._id.constructor.toString().replace(/^function (\S+).+$/, ""), 1); }, function(k, v) { return Array.sum(v); }, { out: { inline: 1 } });

    
ChrisF 28.05.2015 23:07
quelle