sql >> Database >  >> NoSQL >> MongoDB

Is er een manier om het type veld te projecteren?

Er zijn een paar problemen die dit niet praktisch maken:

  1. Aangezien de zoekopdracht een onderscheidende parameter is van de mogelijkheid om een ​​projectie uit te voeren, is dit niet mogelijk met een enkele zoekopdracht alleen, omdat de projectie niet kan worden beïnvloed door de resultaten van de zoekopdracht
  2. Omdat er met het aggregatieraamwerk geen manier is om velden te herhalen en het type te controleren, is dat ook geen optie

Dat gezegd hebbende, er is een ietwat gekke manier om een ​​Map-Reduce te gebruiken die vergelijkbare antwoorden krijgt, zij het in een Map-Reduce-achtige uitvoer die niet geweldig is:

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

Het is niet compleet, maar de resultaten zijn vergelijkbaar met wat je wilde:

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

De kaart kijkt gewoon naar elke eigenschap en beslist of het eruit ziet als een getal ... en zo ja, het toevoegen aan een array die als een object wordt opgeslagen, zodat de engine voor het verkleinen van de kaart zich niet verslikt in de uitvoer van de array. Ik heb het eenvoudig gehouden in de voorbeeldcode - je zou de logica van numerieke en arraycontrole zeker kunnen verbeteren. :)

Het is natuurlijk niet zo live als een find of aggregatie, maar aangezien MongoDB niet met dit in gedachten is ontworpen, moet dit mogelijk voldoende zijn als u deze functionaliteit echt wilde hebben.




  1. Wat is het verschil tussen id en _id in mangoest?

  2. Update array in Mongo-document werkt niet

  3. Fout:sluit ETIMEDOUT aan tijdens het schrapen

  4. Spring Data Mongodb:documenten bijwerken