sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Hay alguna manera de proyectar el tipo de un campo?

Hay algunos problemas que hacen que esto no sea práctico:

  1. Dado que la consulta es un parámetro distintivo de la capacidad de hacer una proyección, esto no es posible con una sola consulta, ya que la proyección no puede verse influenciada por los resultados de la consulta
  2. Como no hay manera con el marco de agregación de iterar campos y verificar el tipo, tampoco es una opción

Dicho esto, hay una manera un poco extravagante de usar Map-Reduce que obtiene respuestas similares, aunque en una salida de estilo Map-Reduce que no es impresionante:

map = function() {
    function isNumber(n) {
      return !isNaN(parseFloat(n)) && isFinite(n);
    }

    var numerics = [];
    for(var fn in this) {
        if (isNumber(this[fn])) {
            numerics.push({f: fn, v: this[fn]});
        }
        if (Array.isArray(this[fn])) {
            // example ... more complex logic needed
            if(isNumber(this[fn][0])) {
                numerics.push({f: fn, v: this[fn]});
            }
        }
    }
    emit(this._id, { n: numerics });
};

reduce = function(key, values) {
  return values;  
};

No está completo, pero los resultados son similares a los que querías:

"_id" : ObjectId("52fac254f40ff600c10e56d4"),
 "value" : {
         "n" : [
                 {
                         "f" : "list",
                         "v" : [
                                 1,
                                 2,
                                 3,
                                 4,
                                 5
                         ]
                 },
                 {
                         "f" : "views",
                         "v" : 5
                 }
         ]
 }

El mapa solo está mirando cada propiedad y decidiendo si parece un número... y si es así, se agrega a una matriz que se almacenará como un objeto para que el motor de reducción de mapas no se ahogue con la salida de la matriz. Lo mantuve simple en el código de ejemplo:podría mejorar la lógica de la verificación numérica y de matrices con seguridad. :)

Por supuesto, no es en vivo como un find o agregación, pero como MongoDB no fue diseñado con esto en mente, esto puede ser suficiente si realmente desea esta funcionalidad.