文章目录
  1. 1. MongoDB系列——中级篇
    1. 1.1. 查找并修改(findAndModify)
    2. 1.2. 单一用途的聚合
      1. 1.2.1. count
      2. 1.2.2. distinct
      3. 1.2.3. group
    3. 1.3. 映射化简(mapReduce)

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>,
# 若为true,被选中对象将在返回前被删除
update: <document>,
# 一个修改器对象
new: <boolean>,
# 若为true,将返回修改后的对象而不是原始对象。在删除操作中,该参数被忽略
fields: <document>,
# 返回对象显示的字段 { <field1>: 1, <field2>: 1, ... }
upsert: <boolean>
# true:查询为空创建新对象
});

# 实例
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() 
# 返回person的记录数,如果person不存在返回0

$ db.person.find().count()
# 同上

distinct

1
2
3
4
5
$ db.person.distinct("name")
# 返回person中的非重复的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)

map-reduce

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函数,进一步对聚合结果做处理,当然这步是可选的。

【未完待续】

文章目录
  1. 1. MongoDB系列——中级篇
    1. 1.1. 查找并修改(findAndModify)
    2. 1.2. 单一用途的聚合
      1. 1.2.1. count
      2. 1.2.2. distinct
      3. 1.2.3. group
    3. 1.3. 映射化简(mapReduce)