我假设您想找到每个文档的众数和中位数,您可以使用 map reduce 来做到这一点。在这种情况下,您在 map 函数中计算中位数和众数,reduce 将返回原样的地图结果
map = function() {
var res = 0;
for (i = 0; i < this.marks.length; i++) {
res = res + this.marks[i];
}
var median = res/this.marks.length;
emit(this._id,{marks:this.marks,median:median});
}
reduce = function (k, values) {
values.forEach(function(value) {
result = value;
});
return result;
}
对于这个系列
{ "_id" : ObjectId("4f02be1f1ae045175f0eb9f1"), "name" : "ram", "marks" : [ 1.22, 12.87, 1.24, 1.24, 9.87, 1.24, 87.65 ] }
{ "_id" : ObjectId("4f02be371ae045175f0eb9f2"), "name" : "sam", "marks" : [ 1.32, 11.87, 12.4, 4.24, 9.37, 3.24, 7.65 ] }
{ "_id" : ObjectId("4f02be4c1ae045175f0eb9f3"), "name" : "pam", "marks" : [ 3.32, 10.17, 11.4, 2.24, 2.37, 3.24, 30.65 ] }
你可以得到中位数
db.test.mapReduce(map,reduce,{out: { inline : 1}})
{
"results" : [
{
"_id" : ObjectId("4f02be1f1ae045175f0eb9f1"),
"value" : {
"marks" : [
1.22,
12.87,
1.24,
1.24,
9.87,
1.24,
87.65
],
"median" : 16.475714285714286
}
},
{
"_id" : ObjectId("4f02be371ae045175f0eb9f2"),
"value" : {
"marks" : [
1.32,
11.87,
12.4,
4.24,
9.37,
3.24,
7.65
],
"median" : 7.155714285714285
}
},
{
"_id" : ObjectId("4f02be4c1ae045175f0eb9f3"),
"value" : {
"marks" : [
3.32,
10.17,
11.4,
2.24,
2.37,
3.24,
30.65
],
"median" : 9.055714285714286
}
}
],
"timeMillis" : 1,
"counts" : {
"input" : 3,
"emit" : 3,
"reduce" : 0,
"output" : 3
},
"ok" : 1,
}