MongoDB系列——中级篇
查找并修改(findAndModify)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| db.collection.findAndModify({ query: <document>, sort: <document>, remove: <boolean>, update: <document>, new: <boolean>, fields: <document>, upsert: <boolean> });
db.person.findAndModify({ query: {age: {$gte: 25}}, sort: {age: -1}, update: {$set: {name: 'a2'}, $inc: {age: 2}} });
|
单一用途的聚合
count
1 2 3 4 5
| $ db.person.count()
$ db.person.find().count()
|
distinct
1 2 3 4 5
| $ db.person.distinct("name")
$ db.runCommand({"distinct":"person", "key":"name"})
|
group
key: 表示要分组的key
initial:表示每组都分享的一个"初始化函数"
$reduce:第一个参数为当前文档对象,第二个参数是上次function操作的累计对象
finalize:每一组文档执行完后,都会触发此方法
condition: 过滤条件
1 2 3 4 5 6 7 8 9 10 11
| db.collection.group({ "key":{"age":true}, "initial":{"person":[]}, "$reduce":function(cur,prev){ prev.person.push(cur.name); }, "finalize":function(out){ out.count = person.length; }, "condition":{"age":{$lt:25}} )
|
映射化简(mapReduce)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| db.collection.mapReduce( <map>, <reduce>, { <out>, <query>, <sort>, <limit>, <keytemp>, <finalize>, <scope>, <jsMode>, <verbose> } )
|
- map:map函数
- reduce:reduce函数
- out:输出结果的collection的名字,不指定会默认创建一个随机名字的collection(如果使用了out选项,就不必指定keeptemp:true了,因为已经隐含在其中了)
- query:一个筛选条件,只有满足条件的文档才会调用map函数。(query。limit,sort可以随意组合)
- sort:和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制
- limit:发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)
- keytemp:true或false,表明结果输出到的collection是否是临时的,如果想在连接关闭后仍然保留这个集合,就要指定keeptemp为true,如果你用的是MongoDB的mongo客户端连接,那必须exit后才会删除。如果是脚本执行,脚本退出或调用close会自动删除结果collection
- finalize:是函数,它会在执行完map、reduce后再对key和value进行一次计算并返回一个最终结果,这是处理过程的最后一步,所以finalize就是一个计算平均数,剪裁数组,清除多余信息的恰当时机
- scope:javascript代码中要用到的变量,在这里定义的变量在map,reduce,finalize函数中可见
- verbose:用于调试的详细输出选项,如果想看MpaReduce的运行过程,可以设置其为true。也可以print把map,reduce,finalize过程中的信息输出到服务器日志上。
在这个映射化简操作中,MongoDB对每个输入文档(例如集合中满足查询条件的文档)执行了map操作。映射操作输出了键值对结果。对那些有多个值的关键字,MongoDB执行reduce操作,收集并压缩了最终的聚合结果。然后MongoDB把结果保存到一个集合中。化简函数还可以把结果输出到finalize函数,进一步对聚合结果做处理,当然这步是可选的。
【未完待续】