mongodb聚合查询
测试数据
db.users.insert([
{"name":"张三","age":18,"sex":"男","status":1,"address":[113,23]},
{"name":"李四","age":20,"sex":"男","status":1,"address":[108,33]},
{"name":"王五","age":20,"sex":"男","status":1,"address":[114,25]},
{"name":"胡大","age":22,"sex":"男","status":1,"address":[109,23]},
{"name":"李二","age":24,"sex":"男","status":1,"address":[110,22]},
{"name":"小明","age":20,"sex":"男","status":1,"address":[113,25]},
{"name":"小红","age":24,"sex":"女","status":1,"address":[110,23]},
{"name":"小花","age":28,"sex":"女","status":1,"address":[111,33]},
{"name":"小倩","age":20,"sex":"女","status":1,"address":[113,53]},
{"name":"王明慧","age":27,"sex":"女","status":1,"address":[111,55]},
{"name":"林小花","age":25,"sex":"女","status":1,"address":[111,110]},
]);
聚合查询 aggregate
aggregate聚合是通过管道操作实现的。
聚合管道:
$project 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。对应project()方法
$match 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。对应match()。
$limit 用来限制MongoDB聚合管道返回的文档数。对应limit()方法
$skip 在聚合管道中跳过指定数量的文档,并返回余下的文档。对应skip()。
$unwind 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。对应unwind()方法
$group 将集合中的文档分组,可用于统计结果。对应group()方法
$sort 将输入文档排序后输出。对应sort()方法
$geoNear 输出接近某一地理位置的有序文档。对应near()。
$project
db.users.aggregate({$project:{_id:0,name:1,age:1,status:1}});
$match
db.users.aggregate({$match:{"age":20}});
$limit
db.users.aggregate({$limit:3});
$skip
db.users.aggregate({$skip:2});
$sort
db.users.aggregate({$sort:{"age":1}});
$geoNear
db.users.createIndex({"address":"2d"});
db.users.aggregate(
{
$geoNear:{
"near":[113,24],
"distanceField":"address",
"spherical":true
}
},
{$limit:1}
);
$group
db.users.aggregate(
{
$group:{
_id:"$sex",//按sex字段分组
min_age:{$min:"$age"},//最小年龄
max_age:{$max:"$age"},//最大年龄
avg_age:{$avg:"$age"},//平均年龄
total:{$sum:1}//分组总数
}
}
);
$group表达式说明:
$sum 计算总和
$avg 计算平均值
$min 获取每一组集合中所有文档对应值得最小值
$max 获取每一组集合中所有文档对应值得最大值
$push 在结果文档中插入值到一个数组中
$addToSet 在结果文档中插入值到一个数组中,但不创建副本
$first 根据资源文档的排序获取第一个文档数据
$last 根据资源文档的排序获取最后一个文档数据
$sum
db.users.aggregate({$group:{_id:"$sex",total:{$sum:1}}});
$avg
db.users.aggregate({$group:{_id:"$sex",avg:{$avg:"$age"}}});
$min
db.users.aggregate({$group:{_id:"$sex",min:{$min:"$age"}}});
$max
db.users.aggregate({$group:{_id:"$sex",max:{$max:"$age"}}});
$push
db.users.aggregate({$group:{_id:"$sex",names:{$push:"$name"}}});
$addToSet
db.users.aggregate({$group:{_id:"$sex",names:{$addToSet:"$name"}}});
$first
db.users.aggregate({$group:{_id:"$sex",first:{$first:"$name"}}});
$last
db.users.aggregate({$group:{_id:"$sex",last:{$last:"$name"}}});
聚合表达式的字符串和算术运算符
$add 计算数值的总和。例如:valuePlus5:{$add:["$value",5]}
$subtract 给定两个数值,用第一个数减去第二个数。例如:{$subtract:["$value",5]}
$multiply 计算数值数组的乘积。例如:{$multiply:["$value",5]}
$divide 给定两个数值,用第一个数除以第二个数。例如:valueDividedBy5:{$divide:["$value",5]}
$mod 取模。例如:{$mod:["$value",5]}
$concat 连接两个字符串 例如:{$concat:["str1","str2"]}
$strcasecmp 比较两个字符串并返回一个整数来反应比较结果。例如 {$strcasecmp:["$value","$value"]}
$substr 返回字符串的一部分。例如:hasTest:{$substr:["$value","test"]}
$toLower 将字符串转化为小写。
$toUpper 将字符串转化为大写
$add
db.users.aggregate({$project:{_id:false,name:true,age:true,sex:true,"add":{$add:["$age",3]}}});
$subtract
db.users.aggregate({$project:{_id:false,name:true,age:true,sex:true,"subtract":{$subtract:["$age",3]}}});
$multiply
db.users.aggregate({$project:{_id:false,name:true,"multiply":{$multiply:["$age",3]}}});
$divide
db.users.aggregate({$project:{_id:false,name:true,"div":{$divide:["$age",3]}}});
$mod
db.users.aggregate({$project:{_id:false,name:true,"mod":{$mod:["$age",3]}}});
$concat
db.users.aggregate({$project:{_id:false,"name_sex":{$concat:["$name",":","$sex"]}}});
$toLower
db.users.aggregate( { $project:{ _id:false, "name":{$toLower:"HuYongJian"} } });
$toUpper
db.users.aggregate( { $project:{ _id:false, "name":{$toUpper:"HuYongJian"} } });

浙公网安备 33010602011771号