2010-07-08 32 views
8

En MongoDB, utilizando $type, es posible filtrar una búsqueda según si el campo coincide con un tipo de datos BSON (consulte DOCS).Devuelve el tipo real de un campo en MongoDB

Por ej.

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

que devuelve:

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

necesito una consulta que me diga lo que el tipo real del campo es, para cada campo en una colección. ¿Es esto posible con MongoDB?

Respuesta

6

bien, he aquí algunas preguntas relacionadas que pueden ayudar:

Get all field names en una colección en el mapa-a reducir.

Aquí está a recursive version que enumera todos los campos posibles.

Espero que pueda comenzar. Sin embargo, sospecho que se encontrará con algunos problemas con esta solicitud. Aquí hay dos problemas:

  1. No encuentro la función "gettype" para JSON. Puede realizar consultas por $type, pero no parece que realmente pueda ejecutar una función gettype en un campo y hacer que los mapas vuelvan al tipo BSON.
  2. Un campo puede contener datos de varios tipos, por lo que necesitará un plan para manejarlo. Incluso si no es aparente, Mongo podría almacenar algunos números como ints y otros flotantes sin que realmente lo sepas. De hecho, con el controlador PHP, esto es bastante posible.

Así que si usted asume que pueda solucionar el problema # 1, entonces usted debería ser capaz de resolver el problema # 2 con una ligera variación en "Obtener todos los nombres de campo".

Probablemente algo como esto:

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

Así que básicamente emitiría la key y la type of key value (como una matriz) en la función de mapa. Luego, desde la función de reducción, agregará entradas únicas para cada tipo.

Al final de la carrera que tendría que datos como estos

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

Por supuesto, todo esto es un montón de trabajo, dependiendo de su problema real, es posible que sólo quieren garantizar (de su código) que siempre está poniendo el tipo correcto de datos. Encontrar el tipo de datos después de que los datos estén en la base de datos definitivamente es un dolor.

6

tipo de la consulta a continuación en el mongo shell

typeof db.employee.findOne().first_name 

Sintaxis

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

Esto le dará al tipo JS, que puede diferir de la de tipo BSON. Por ejemplo, si escribe typeof db.employee.findOne() ._id, obtendrá "string", pero el tipo BSON es "Object id". –

0

Observando que a=5;a.constructor.toString() impresiones function Number() { [native code] }, se puede hacer algo similar 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 partir de MongoDB 3.4, usted c use el operador de agregación $type para devolver el tipo de un campo.

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

que produce:

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