Jest kilka problemów, które sprawiają, że jest to niepraktyczne:
- Ponieważ zapytanie jest parametrem odróżniającym od możliwości wykonania prognozy, nie jest to możliwe z pojedynczego zapytania, ponieważ na projekcję nie mogą wpływać wyniki zapytania
- Ponieważ w ramach agregacji nie ma możliwości iteracji pól i typu sprawdzania, nie jest to również możliwe
Biorąc to pod uwagę, istnieje nieco dziwny sposób korzystania z funkcji Map-Reduce, która daje podobne odpowiedzi, aczkolwiek w stylu wyjściowym w stylu Map-Reduce, który nie jest niesamowity:
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;
};
Nie jest kompletny, ale wyniki są podobne do tego, czego oczekiwałeś:
"_id" : ObjectId("52fac254f40ff600c10e56d4"),
"value" : {
"n" : [
{
"f" : "list",
"v" : [
1,
2,
3,
4,
5
]
},
{
"f" : "views",
"v" : 5
}
]
}
Mapa po prostu patrzy na każdą właściwość i decyduje, czy wygląda jak liczba... a jeśli tak, dodaje do tablicy, która będzie przechowywana jako obiekt, aby silnik map-reduce nie dławił danych wyjściowych tablicy. W przykładowym kodzie utrzymałem to w prosty sposób - na pewno można poprawić logikę sprawdzania liczb i tablic. :)
Oczywiście nie działa jak find
lub agregacji, ale ponieważ MongoDB nie został zaprojektowany z myślą o tym, może to być konieczne, jeśli naprawdę potrzebujesz tej funkcji.