Ada beberapa masalah yang membuat ini tidak praktis:
- Karena kueri merupakan parameter khusus dari kemampuan melakukan proyeksi, hal ini tidak mungkin dilakukan hanya dari satu kueri, karena proyeksi tidak dapat dipengaruhi oleh hasil kueri
- Karena tidak ada cara dengan kerangka kerja agregasi untuk mengulangi bidang dan memeriksa jenis, itu juga bukan pilihan
Meskipun demikian, ada cara yang agak aneh dalam menggunakan Map-Reduce yang mendapatkan jawaban serupa, meskipun dalam output gaya Map-Reduce yang tidak mengagumkan:
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;
};
Belum lengkap, tapi hasilnya sesuai dengan yang diinginkan:
"_id" : ObjectId("52fac254f40ff600c10e56d4"),
"value" : {
"n" : [
{
"f" : "list",
"v" : [
1,
2,
3,
4,
5
]
},
{
"f" : "views",
"v" : 5
}
]
}
Peta hanya melihat setiap properti dan memutuskan apakah itu terlihat seperti angka ... dan jika demikian, menambahkan ke array yang akan disimpan sebagai objek sehingga mesin pengurang peta tidak akan tersedak pada output array. Saya telah membuatnya tetap sederhana dalam kode contoh -- Anda pasti dapat meningkatkan logika pemeriksaan numerik dan array. :)
Tentu saja, ini tidak hidup seperti find
atau agregasi, tetapi karena MongoDB tidak dirancang dengan mempertimbangkan hal ini, ini mungkin harus dilakukan jika Anda benar-benar menginginkan fungsi ini.