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"} } });
posted @ 2021-08-07 02:26  胡勇健  阅读(88)  评论(0)    收藏  举报