2010-07-08 21 views
8

In MongoDB, utilizzando $type, è possibile filtrare una ricerca in base a se il campo corrisponde a un tipo di dati BSON (vedere DOCS).Restituisce il tipo effettivo di un campo in MongoDB

Ad es.

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

che restituisce:

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

Ho bisogno di una query che mi dirà quello che il tipo effettivo del campo è, per ogni campo in una collezione. È possibile con MongoDB?

risposta

6

OK, qui ci sono alcune domande relative che possono aiutare:

Get all field names in una collezione usando la mappa-ridurre.

Ecco lo a recursive version che elenca tutti i campi possibili.

Speriamo che questo possa farti iniziare. Tuttavia, sospetto che avrai qualche problema con questa richiesta. Ci sono due problemi qui:

  1. Non riesco a trovare una funzione "gettype" per JSON. Puoi eseguire una query per $type, ma non sembra che tu possa effettivamente eseguire una funzione gettype su un campo e riportare le mappe al tipo BSON.
  2. Un campo può contenere dati di più tipi, quindi è necessario un piano per gestirlo. Anche se non è evidente, Mongo potrebbe memorizzare alcuni numeri come inti e altri galleggiano senza che tu lo sappia davvero. In effetti, con il driver PHP, questo è abbastanza possibile.

Quindi, se si assume che si può risolvere il problema # 1, allora si dovrebbe essere in grado di risolvere il problema # 2 con una leggera variante "Get tutti i nomi dei campi".

Sarebbe probabilmente simile a questa:

"map" : function() { for (var key in this) { emit(key, [ typeof value[key] ]); } } 
"reduce" : function(key, stuff) { return (key, add_to_set(stuff)); } 

Quindi, in pratica si dovrebbe emettere la key e la type of key value (come un array) nella funzione mappa. Quindi dalla funzione di riduzione si aggiungerebbero voci univoche per ciascun tipo.

Alla fine della corsa si avrebbe dati come questo

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

Naturalmente, questo è tutto un sacco di lavoro, a seconda del vostro problema reale, si può fare, per assicurare (da il tuo codice) che stai sempre inserendo il giusto tipo di dati. Trovare il tipo di dati dopo che i dati sono nel DB è sicuramente un problema.

6

tipo la query di seguito in Mongo guscio

typeof db.employee.findOne().first_name 

Sintassi

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

Questo darà il tipo JS, che può essere diverso dal tipo BSON. Ad esempio, se si digita db.employee.findOne() ._ id, si otterrà "string", ma il tipo BSON è "ID oggetto". –

0

Notando che a=5;a.constructor.toString() stampe function Number() { [native code] }, si può fare qualcosa di simile a:

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

A partire da MongoDB 3.4, c utilizzare l'operatore di aggregazione $type per restituire il tipo di un campo.

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

che produce:

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