MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Existe-t-il un moyen de projeter le type d'un champ

Il y a quelques problèmes qui rendent cela peu pratique :

  1. Étant donné que la requête est un paramètre distinctif de la possibilité de faire une projection, cela n'est pas possible à partir d'une seule requête seule, car la projection ne peut pas être influencée par les résultats de la requête
  2. Comme il n'y a aucun moyen avec le cadre d'agrégation d'itérer les champs et de vérifier le type, ce n'est pas non plus une option

Cela étant dit, il existe une façon un peu farfelue d'utiliser un Map-Reduce qui obtient des réponses similaires, bien que dans une sortie de style Map-Reduce qui ne soit pas géniale :

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;  
};

Ce n'est pas complet, mais les résultats sont similaires à ce que vous vouliez :

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

La carte regarde simplement chaque propriété et décide si elle ressemble à un nombre ... et si c'est le cas, ajoute à un tableau qui sera stocké en tant qu'objet afin que le moteur de réduction de carte ne s'étouffe pas avec la sortie du tableau. J'ai gardé les choses simples dans l'exemple de code - vous pourriez certainement améliorer la logique de vérification des nombres et des tableaux. :)

Bien sûr, ce n'est pas en direct comme une find ou l'agrégation, mais comme MongoDB n'a pas été conçu dans cet esprit, cela peut être nécessaire si vous vouliez vraiment cette fonctionnalité.