(一)管道操作符
每个操作符都会接受一连串的文档,对这些文档做类型转换,最后将转换后的文档作为结果传递给下一个操作符,对于最后一个管道操作符,将结果返回客户端。
不同管道操作符可以按任意顺序组合在一起使用,而且可以重复多次使用。
1、”$match”
用于对文档集合进行筛选,应该尽可能将”$match”放在管道的前面位置,可以快速将不需要的文档过滤掉;在投射和分组之前执行”$match”,可以使用索引。
“$match”可以使用所有常规的查询操作符,但是不能使用地理空间操作符。
2、”$project”
使用”$project”操作可以从文档中提取字段,可以指定包含或排除某个字段。
对投射字段进行重命名,使用”$fieldName”语法为了在聚合框架中引用fielaName字段的值,将要被替换名字的字段写成 “$fieldName”。必须明确将”_id”字段排除,否则值会被返回两次:
MongoDB不会记录字段的历史名称,如果在原始字段上有索引,但是聚合框架无法在重命名后的字段上使用索引。应该尽量在修改字段名称之前使用索引。
管道表达式
1、”$add”:[expr1[,expr2,expr3….exprN]]
接受同一个文档中一个或多个表达式作为参数,将这些表达式相加。
2、”$subtract”:[expr1,expr2]
接受两个表达式作为参数,用第一个表达式减去第二个表达式作为结果:
3、”$multiply”:[expr1[,expr2,expr3…..exprN]]
接受一个或多个表达式,并且将它们相乘。
4、”$divide”:[expr1,expr2]
接受两个表达式,用第一个除以第二个表达式的商作为结果。
5、”$mod”:[expr1,expr2]
接受两个表达式,将得到的余数作为结果。
6、表达式可以进行任意层次的嵌套
7、日期表达式
只能对日期类型的字段进行日期操作,不能对数值类型字段做日期操作。”$year” , “$month” , “$week” ,”$hour” ,”$minute” ,”$second”。
使用字面量日期:
字符串表达式
1、”$substr”:[expr,startOffset,numToReturn]
第一个参数必须是一个字符串,该操作会截取子串,从startOffset字节开始的numToReturn字节。。注意,是字节,而不是字符。
2、”$concat”:[expr1[,expr2,expr3…..exprN]]
将给定的表达式连接在一起。
3、”$toLower”:expr
参数表达式必须是字符串,返回小写形式:
3、”$toUpper”:expr
参数表达式必须是字符串,返回大写形式:
逻辑表达式
1、”$cmp”:[expr1,expr2]
比较两个表达式,如果相等,返回0;如果expr1小于expr2,返回负数;如果expr1>expr2,返回正数。
2、”$eq” | “$ne” | “$gt”|”$lt”|”$gte”|”$lte”:[expr1,expr2]
两个表达式执行相应的比较操作,返回true或false:
3、”$and”:[expr1[,expr2,expr3….exprN]]
如果所有表达式的值都是true,那就返回true,否则返回false:
3、”$or”:[expr1[,expr2,expr3….exprN]]
只要存在表达式的值是true,那就返回true,否则返回false:
4、”$not”:expr
对表达式取反:
控制语句
1、”$cond”:[booleanExpr,trueExpr,falseExpr]
如果booleanExpr的值是true,那就返回trueExpr,否则返回falseExpr:
2、”$ifNull”:[expr,replacementExpr]
如果expr是null,返回replacementExpr,否则返回expr:
“$group”
可以将文档依据特定字段的不同值进行分组。如果选定了需要进行分组的字段,可以将选定的字段传递给”$group”函数的”_id”字段。执行分组后,结果集中每个分组对应一个只有一个字段的文档。
算术操作符
“$sum”:value
对于分组中的每个文档,将value与计算结果相加。
“$avg”:value
返回每个分组的平均值
极致操作符
“$max”:expr
返回分组内的最大值
“$min”:expr
返回分组内的最小值
“$group”操作必须等收到所有的文档之后,才能对文档进行分组。然后才能将各个分组发送给管道中的下一个操作符。
“$unwind”
拆分可以将数组中的每一个值拆分为单独的文档。
“$sort”
可以根据任何字段进行排序。如果要对大量的文档进行排序,在第一阶段进行排序,可以使用索引。可以在排序中使用实际存在的字段,也可以使用投射中重命名的名字。不要写成{“$sort”:{“$age”:1}}
“$sort”操作也必须要接收到所有文档之后才能进行排序。
“$limit”:n
返回结果集中的前n个文档
“$skip”:n
丢弃结果集中的前n个文档,将剩余文档返回。
使用管道
应该在管道的开始阶段就尽可能多的文档和字段过滤掉。管道如果不是直接从原先的集合中使用数据,那就无法在筛选和排序中使用索引。
多个操作之间依次用 ‘,’隔开。
四、MapReduce
五、返回集合中文档的数量
查找给定键的所有不同值,必须指定集合和键:
其中distinct指定集合,key指定键。