sql >> Database teknologi >  >> NoSQL >> MongoDB

Er der en måde at projicere typen af ​​et felt på

Der er et par problemer, der gør dette upraktisk:

  1. Da forespørgslen er en karakteristisk parameter fra evnen til at lave en projektion, er dette ikke muligt fra en enkelt forespørgsel alene, da projektionen ikke kan påvirkes af resultaterne af forespørgslen
  2. Da der ikke er nogen måde med aggregeringsrammen at gentage felter og kontroltype, er det heller ikke en mulighed

Når det er sagt, er der en lidt skør måde at bruge en Map-Reduce på, der får lignende svar, omend i en Map-Reduce-stil-output, der ikke er fantastisk:

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

Det er ikke komplet, men resultaterne ligner det, du ønskede:

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

Kortet kigger bare på hver egenskab og beslutter, om det ligner et tal ... og i så fald tilføjes det til et array, der vil blive gemt som et objekt, så kort-reduceringsmotoren ikke chokerer på array-output. Jeg har holdt det simpelt i eksempelkoden -- du kan helt sikkert forbedre logikken i numerisk og array-kontrol. :)

Selvfølgelig er det ikke live som et find eller aggregering, men da MongoDB ikke er designet med dette i tankerne, kan dette være nødvendigt, hvis du virkelig ville have denne funktionalitet.




  1. Laravel 5.2 Mongo MonogDB Kunne ikke parse MongoDB URI

  2. Hvordan undgår man Redis-opkald i Lua-scriptbegrænsninger?

  3. Dump Mongo Collection i JSON-format

  4. Konsekvent hashing som en måde at skalere skrivninger på