又发现一种查询写法$where
db.class.find({$where:function(){return this.stuCount==10}})
排重
db.class.distinct("stuCount")
一、MapReduce(摘录MongoDB实战)
MongoDB 的 MapReduce 相当于 sql 中的"group by", 所以在 MongoDB 上使用 Map/Reduce
进行并行"统计"很容易。
使用 MapReduce 要实现两个函数 Map 函数和 Reduce 函数,Map 函数调用 emit(key, value),
遍历collection中所有的记录, 将key与value传递给Reduce函数进行处理。 Map函数和Reduce
函数可以使用 JavaScript 来实现,可以通过 db.runCommand 或 mapReduce 命令来执行一个
MapReduce 的操作:
db.runCommand( { mapreduce : <collection>, map : <mapfunction>, reduce : <reducefunction> [, query : <query filter object>] [, sort : <sorts the input objects using this key. Useful for optimization, like sorting by the emit key for fewer reduces>] [, limit : <number of objects to return from collection>] [, out : <see output options below>] [, keeptemp: <true|false>] [, finalize : <finalizefunction>] [, scope : <object where fields go into javascript global scope >] [, verbose : true] } );
参数说明:
mapreduce: 要操作的目标集合。
map: 映射函数 (生成键值对序列,作为 reduce 函数参数)。
reduce: 统计函数。
query: 目标记录过滤。
sort: 目标记录排序。
limit: 限制目标记录数量。
out: 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
keeptemp: 是否保留临时集合。
finalize: 最终处理函数 (对 reduce 返回结果进行最终整理后存入结果集合)。
scope: 向 map、reduce、finalize 导入外部变量。
verbose: 显示详细的时间统计信息
首先准备些数据
db.students.insert({classid:2, age:16, name:'Lily'}) db.students.insert({classid:2, age:9, name:'Tony'}) db.students.insert({classid:2, age:19, name:'Harry'}) db.students.insert({classid:2, age:13, name:'Vincent'}) db.students.insert({classid:1, age:14, name:'Bill'}) db.students.insert({classid:2, age:17, name:'Bruce'}) db.students.insert({classid:1, age:14, name:'Tom'}) db.students.insert({classid:1, age:12, name:'Jacky'})
1、Map 函数必须调用 emit(key, value) 返回键值对,使用 this 访问当前待处理的 Document。
map=function(){emit(this.classid,1)}
value 可以使用 JSON Object 传递 (支持多个属性值)。例如:
emit(this.classid, {count:1})
map=function(){emit(this.classid,{count:1})}
2、Reduce 函数接收的参数类似 Group 效果,将 Map 返回的键值序列组合成 { key, [value1,
value2, value3, value...] } 传递给 reduce。
reduce=function(key,values){ var x=0; values.forEach(function(v){x+=v}); return x; }
Reduce 函数对这些 values 进行 "统计" 操作,返回结果可以使用 JSON Object。
3、Result
res=db.runCommand({ mapReduce:"students", map:map, reduce:reduce, out:"students_res" });
mapReduce() 将结果存储在 "students_res" 表中。
4、Finalize
f = function(key, value) { return {classid:key, count:value}; }
5、Options
> res = db.runCommand({ ... mapreduce:"students", ... map:m, ... reduce:r, ... out:"students_res", ... finalize:f, ... query:{age:{$lt:10}} ... });
只取年龄大于10的。
result: "存放的集合名“;
input:传入文档的个数。
emit:此函数被调用的次数。
reduce:此函数被调用的次数。
output:最后返回文档的个数。
---------------------------------------------------------------------------------------------------------------------------------
最后还是感觉这样理解更方便
mapReduce其实是一种编程模型,用在分布式计算中,其中有一个“map”函数,一个”reduce“函数。
① map:
这个称为映射函数,里面会调用emit(key,value),集合会按照你指定的key进行映射分组。
② reduce:
这个称为简化函数,会对map分组后的数据进行分组简化,注意:在reduce(key,value)中的key就是
emit中的key,vlaue为emit分组后的emit(value)的集合,这里也就是很多{"count":1}的数组。
③ mapReduce:
这个就是最后执行的函数了,参数为map,reduce和一些可选参数