Es gibt ein paar Probleme, die dies nicht praktikabel machen:
- Da die Abfrage ein charakteristischer Parameter für die Fähigkeit ist, eine Hochrechnung durchzuführen, ist dies nicht durch eine einzelne Abfrage allein möglich, da die Hochrechnung nicht durch die Ergebnisse der Abfrage beeinflusst werden kann
- Da es mit dem Aggregations-Framework keine Möglichkeit gibt, Felder zu iterieren und den Typ zu überprüfen, ist dies auch keine Option
Abgesehen davon gibt es eine etwas verrückte Art, Map-Reduce zu verwenden, die ähnliche Antworten liefert, wenn auch in einer Ausgabe im Map-Reduce-Stil, die nicht großartig ist:
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;
};
Es ist nicht vollständig, aber die Ergebnisse ähneln denen, die Sie wollten:
"_id" : ObjectId("52fac254f40ff600c10e56d4"),
"value" : {
"n" : [
{
"f" : "list",
"v" : [
1,
2,
3,
4,
5
]
},
{
"f" : "views",
"v" : 5
}
]
}
Die Map betrachtet nur jede Eigenschaft und entscheidet, ob sie wie eine Zahl aussieht ... und wenn ja, fügt sie einem Array hinzu, das als Objekt gespeichert wird, damit die Map-Reduce-Engine die Array-Ausgabe nicht erstickt. Ich habe es im Beispielcode einfach gehalten – Sie könnten die Logik der numerischen und Array-Prüfung sicher verbessern. :)
Natürlich ist es nicht live wie ein find
oder Aggregation, aber da MongoDB nicht dafür entwickelt wurde, muss dies möglicherweise ausreichen, wenn Sie diese Funktionalität wirklich wollen.