2010-07-08 15 views
8

In MongoDB mit $type ist es möglich, eine Suche basierend darauf zu filtern, ob das Feld einem BSON-Datentyp entspricht (siehe DOCS).Tatsächlichen Typ eines Feldes in MongoDB zurückgeben

Für z.

db.posts.find({date2: {$type: 9}}, {date2: 1}) 

, die zurückgibt:

{ 
    "_id" : ObjectId("4c0ec11e8fd2e65c0b010000"), 
    "date2" : "Fri Jul 09 2010 08:25:26 GMT" 
} 

ich eine Abfrage benötigen, die mir sagen, was die tatsächliche Art des Feldes ist, für jedes Feld in einer Sammlung. Ist das mit MongoDB möglich?

Antwort

6

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:

  1. 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.
  2. 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.

6

Typ die folgende Abfrage in Mongo

typeof db.employee.findOne().first_name 

Syntax

typeof db.collection_name.findOne().field_name 
+1

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". –

0

Anbetracht deren, dass a=5;a.constructor.toString() drucken function Number() { [native code] }, Shell ein etwas ähnliches tun:

von

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

6

Start MongoDB 3.4, Sie c Verwenden Sie den Aggregationsoperator $type, um den Feldtyp zurückzugeben.

db.posts.aggregate( 
    [ 
     { "$project": { "fieldType": { "$type": "$date2" } } } 
    ] 
) 

das ergibt:

{ 
    "_id" : ObjectId("4c0ec11e8fd2e65c0b010000"), 
    "fieldType" : "string" 
}