Der er et par problemer, der gør dette upraktisk:
- 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
- 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.