Có một số vấn đề khiến điều này không thực tế:
- Vì truy vấn là một tham số phân biệt với khả năng thực hiện phép chiếu, điều này không thể thực hiện được chỉ từ một truy vấn duy nhất, vì phép chiếu không thể bị ảnh hưởng bởi kết quả của truy vấn
- Vì không có cách nào với khung tổng hợp để lặp lại các trường và loại kiểm tra, đó cũng không phải là một tùy chọn
Điều đó đang được nói, có một cách hơi kỳ lạ khi sử dụng Map-Reduce sẽ nhận được các câu trả lời tương tự, mặc dù trong đầu ra kiểu Map-Reduce không tuyệt vời:
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;
};
Nó không hoàn chỉnh, nhưng kết quả tương tự như những gì bạn muốn:
"_id" : ObjectId("52fac254f40ff600c10e56d4"),
"value" : {
"n" : [
{
"f" : "list",
"v" : [
1,
2,
3,
4,
5
]
},
{
"f" : "views",
"v" : 5
}
]
}
Bản đồ chỉ xem xét từng thuộc tính và quyết định xem nó có giống như một số hay không ... và nếu có, hãy thêm vào một mảng sẽ được lưu trữ dưới dạng một đối tượng để công cụ giảm bản đồ không bị nghẹt đầu ra của mảng. Tôi đã giữ nó đơn giản trong mã ví dụ - bạn có thể cải thiện logic của việc kiểm tra số và mảng chắc chắn. :)
Tất nhiên, nó không trực tiếp giống như một find
hoặc tổng hợp, nhưng vì MongoDB không được thiết kế với mục đích này, nên điều này có thể phải thực hiện nếu bạn thực sự muốn chức năng này.