mongodb聚合联系题目及参考答案

mongodb作业

作业要求

  • 1.向emp集合中添加20条数据
    包含:员工姓名,职位,薪水,入职日期,部门,电话,爱好 等信息
    其中 部门包含部门名称和部门经理 爱好为数组

  • 2.查询薪水在3000-5000之间的员工信息

  • 3.查询入职最早的3名员工信息

  • 4.查询每个职位的平均工资

  • 5.查询每个部门的最高工资和最低工资

  • 6.查询至少有唱歌和跳舞两个爱好的员工信息

  • 7.对工资分等级、

    • 0–3000 蓝领
    • 3000-5000 白领
    • 5000-金领
    • 统计每个等级的人数
  • 8.统计每个职位的员工姓名

  • 9.查询电话号码中有豹子号的员工信息 “000” “111” … “999”

  • 10.查询每个部门工资最高的员工电话

参考答案

0、创建数据库、集合
use my_db    //常见my_db数据库
db.createCollection('emp')// 创建emp 集合
1、 向emp集合中添加20条数据
db.emp.insertMany([
	{name:"小王",age:28,position:"前台",salary:3500,date:"2020/4/5",department:{bm:"人才部",job:"员工"},phone:"8871085421",address:"武汉",hobby:["爬山","打球","唱歌"]
},
	{name:"小张",age:29,position:"前台",salary:3500,date:"2020/8/5",department:{bm:"人才部",job:"员工"},phone:"8871085621",address:"重庆",hobby:["跳舞","打球","唱歌"]
},
{name:"刘妮",age:18,position:"老板娘",salary:100000,date:"2020/3/14",department:{bm:"领导",job:"老板娘"},phone:"18871085421",address:"钟祥",hobby:["睡觉","旅游","唱歌"]
},
	{name:"小何",age:21,position:"技术部主管",salary:8500,date:"2020/5/3",department:{bm:"技术部",job:"技术总监"},phone:"18871085421",address:"襄阳",hobby:["打游戏","打球","旅游"]
},
	{name:"胡八一",age:38,position:"软件工程师",salary:9000,date:"2020/3/15",department:{bm:"技术部",job:"员工"},phone:"18671085421",address:"武汉",hobby:["爬山","打球","唱歌"]
},
	{name:"小肖",age:29,position:"HR",salary:4500,date:"2020/7/5",department:{bm:"销售部",job:"员工"},phone:"15871085621",address:"仙桃",hobby:["跑步","喝酒","吹牛"]
},
	{name:"瑞哥",age:58,position:"软件工程师",salary:9000,date:"2020/3/15",department:{bm:"技术部",job:"员工"},phone:"18671085421",address:"武汉",hobby:["爬山","打球","唱歌"]
},
	{name:"江哥",age:49,position:"数据库管理员",salary:7500,date:"2020/4/5",department:{bm:"技术部",job:"员工"},phone:"13465145621",address:"襄阳",hobby:["短跑","跳远","钓鱼"]
},
	{name:"王宝",age:38,position:"网管工程师",salary:9000,date:"2020/3/15",department:{bm:"技术部",job:"员工"},phone:"18671095421",address:"武汉",hobby:["爬山","打球","喝酒"]
},
	{name:"小五",age:29,position:"网络管理员",salary:4500,date:"2020/6/5",department:{bm:"技术部",job:"员工"},phone:"13471084521",address:"山东",hobby:["睡觉","打游戏"]
},
	{name:"小韩",age:19,position:"技术部",salary:4500,date:"2020/7/5",department:{bm:"技术部",job:"员工"},phone:"13471085621",address:"山东",hobby:["钓鱼","打游戏","喝酒"]
},
	{name:"胡一",age:38,position:"系统工程师",salary:9000,date:"2020/3/15",department:{bm:"技术部",job:"员工"},phone:"16871085421",address:"上海",hobby:["爬山","打球","唱歌"]
},
	{name:"王五",age:38,position:"销售",salary:5000,date:"2020/5/15",department:{bm:"销售部",job:"负责人"},phone:"17671085421",address:"美国",hobby:["爬山","打球","唱歌"]
},
	{name:"张二狗",age:29,position:"保安",salary:2500,date:"2020/4/5",department:{bm:"保安部",job:"员工"},phone:"12012054110",address:"仙桃",hobby:["跑步","打游戏","看电影"]
},
	{name:"李二狗",age:48,position:"保安",salary:3000,date:"2020/3/15",department:{bm:"保安部",job:"负责人"},phone:"78945612311",address:"武汉",hobby:["爬山","打球","唱歌"]
},
	{name:"冥蒙",age:49,position:"推销员",salary:7500,date:"2020/5/5",department:{bm:"销售部",job:"员工"},phone:"134651453321",address:"襄阳",hobby:["短跑","跳远","聊天"]
},
	{name:"小邓",age:28,position:"策划员",salary:5000,date:"2020/6/15",department:{bm:"技术部",job:"员工"},phone:"17771095421",address:"甘肃",hobby:["爬山","打球","喝酒"]
},
	{name:"周三",age:29,position:"讲师",salary:6500,date:"2020/6/5",department:{bm:"培训部",job:"员工"},phone:"1111084521",address:"山西",hobby:["睡觉","游戏","吃饭"]
},
	{name:"赵飞",age:19,position:"讲师",salary:6500,date:"2020/7/4",department:{bm:"培训部",job:"负责人"},phone:"13471081111",address:"西安",hobby:["钓鱼","打游戏","喝酒"]
},
	{name:"小田",age:28,position:"辅导员",salary:3500,date:"2020/3/15",department:{bm:"人才部",job:"负责人"},phone:"12871085421",address:"上海",hobby:["爬山","跳舞","唱歌"]
}
])
2、查询薪水在3000-5000之间的员工
db.emp.find({salary:{$gte:3000,$lte:5000}})
3、查询入职最早的3名员工信息
 db.emp.find({}).sort({"date":1}).limit(3)
4、查询每个职位的平均工资
 db.emp.aggregate(
 {
     "$group":{
         "_id":"$position",
         "avg":{"$avg":"$salary"}
         }
     }
 )
5、查询每个部门的最高工资和最低工资
 db.emp.aggregate(
 {
     "$group":{
         "_id":"$department",
         "max":{"$max":"$salary"},
         "min":{"$min":"$salary"}
         }
     }
 )
 
6、查询至少有唱歌和跳舞两个爱好的员工信息
 db.emp.find({$and:[{"hobby":"跳舞"},{"hobby":"唱歌"}]})
7、对工资分等级
  • 0–3000 蓝领
  • 3000-5000 白领
  • 5000-金领
  • 统计每个等级的人数
var a_count=0;
var b_count=0;
var c_count=0;
db.emp.find({}).forEach(
	function(emp)
	{
	    if(emp.salary>0 && emp.salary<3000)
	    {
	        a_count+=1;
	    }
	    else if(emp.salary>=3000 && emp.salary<5000)
	    {
	        b_count+=1;
	    }else if(emp.salary == 5000)
	    { 
	        c_count+=1;
	    }
	}
)
print(" 0--3000    蓝领="+a_count+"\n","3000--5000 白领="+b_count+"\n","5000       金领="+c_count)
8、统计每个职位的员工姓名
db.emp.aggregate({
    $group:{
        _id:"$position",
        con:{$push:"$name"}
    }
})
9、查询电话号码中有豹子号的员工信息 “000” “111” … “999”
db.emp.find({$or:[{phone:/000/},{phone:/111/},{phone:/222/},{phone:/333/},{phone:/444/},{phone:/555/},{phone:/666/},{phone:/777/},{phone:/888/},{phone:/999/}]})
10、查询每个部门工资最高的员工电话
db.emp.aggregate([{
		$group:{
         _id:"$department.bm",
         max_salary:{$max:"$salary"},
         phone:{$push:"$phone"}
         
		}}])

总结

  • 聚合知识
Collection对象提供了aggregate()方法来对数据进行聚合操作。
aggregate()方法的语法如下
aggregate(operators,[options],callback)

在aggregate()方法聚合运算符

运算符说明
$project通过重命名,添加或删除字段重塑文档。你也可以重新计算值,并添加子文档。
包括title并排除name:{$project:{title:1,name:0}}
把name重命名为title {KaTeX parse error: Expected '}', got 'EOF' at end of input: project{title:"name"}}
添加一个新的total字段,并用price和tax字段计算它的值 {KaTeX parse error: Expected '}', got 'EOF' at end of input: project{total:{add:[“ p r i c e " , " price"," price","tax”]}}}
$match通过使用query对象运算符来过滤文档集。
$limit限定可以传递到聚合操作的下一个管道中的文档数量。例如{$limit:5}
$skip指定处理聚合操作的下一个管道前跳过的一些文档
$unwind指定一个数组字段用于分割,对每个值创建一个单独的文档。例如{ u n w i n d : " unwind:" unwind:"myArr"}
$group把文档分成一组新的文档用于在管道中的下一级。新对象的字段必须在KaTeX parse error: Expected '}', got 'EOF' at end of input: …面的语句汇总value字段:{group:{set_id:“KaTeX parse error: Expected '}', got 'EOF' at end of input: 0_id",total:{sum:”$value"}}}
$sort在把文档传递给处理聚合操作的下一个管道前对它们排序。排序指定一个带有field:<sort_order>属性的对象,其中<sort_order>为1表示升序,而-1表示降序

$group表达式运算符

运算符说明
$addToSet返回一组文档中所有文档所选字段的全部唯一值的数组。例如:colors:{$addToSet:“color”}
$first返回一组文档中一个字段的第一个值。例如:firstValue:{ f i r s t : " first:" first:"value"}
$last返回一组文档中一个字段的最后一个值。例如:lastValue:{ l a s t : " last:" last:"value"}
$max返回一组文档中一个字段的最大值。例如:maxValue:{ m a x : " max:" max:"value"}
$min返回一组文档中一个字段的最小值。例如:minValue:{ m i n : " min:" min:"value"}
$avg返回一组文档中以个字段的平均值。例如:avgValue:{ a v g : " avg:" avg:"value"}
$push返回一组文档中所有文档所选字段的全部值的数组。例如:username:{ p u s h : " push:" push:"username"}
$sum返回一组文档中以个字段的全部值的总和。例如:total:{ s u m : " sum:" sum:"value"}

聚合表达式的字符串和算术运算符

运算符说明
$add计算数值的总和。例如:valuePlus5:{ a d d : [ " add:[" add:["value",5]}
$divide给定两个数值,用第一个数除以第二个数。例如:valueDividedBy5:{ d i v i d e : [ " divide:[" divide:["value",5]}
$mod取模。例如:{ m o d : [ " mod:[" mod:["value",5]}
$multiply计算数值数组的乘积。例如:{ m u l t i p l y : [ " multiply:[" multiply:["value",5]}
$subtract给定两个数值,用第一个数减去第二个数。例如:{ s u b t r a c t : [ " subtract:[" subtract:["value",5]}
$concat连接两个字符串 例如:{$concat:[“str1”,“str2”]}
$strcasecmp比较两个字符串并返回一个整数来反应比较结果。例如 { s t r c a s e c m p : [ " strcasecmp:[" strcasecmp:["value","$value"]}
$substr返回字符串的一部分。例如:hasTest:{ s u b s t r : [ " substr:[" substr:["value",“test”]}
$toLower将字符串转化为小写。
$toUpper将字符串转化为大写
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
MongoDB中,聚合查询是用于对集合中的文档进行多个操作并返回计算结果的操作。常见的MongoDB聚合操作包括: - `$match`:用于筛选满足指定条件的文档。 - `$group`:用于根据指定字段对文档进行分组,并可以对分组后的文档进行一些聚合操作,如求和、计数等。 - `$sort`:用于对文档进行排序。 - `$project`:用于选择指定字段,并可以进行一些表达式的计算和转换。 - `$limit`:用于限制返回的文档数量。 - `$sum`:用于对指定字段进行求和计算。 - `$count`:用于统计文档数量。 - `$lookup`:用于对多个集合进行关联查询。 例如,以下是一个使用聚合查询的示例语法: ``` db.collection.aggregate([ { $match: { field: value } }, { $group: { _id: "$field", total: { $sum: "$field2" } } }, { $sort: { total: -1 } }, { $limit: 10 } ]) ``` 以上示例中,首先使用`$match`操作筛选出满足条件的文档,然后使用`$group`操作按照指定字段进行分组,并使用`$sum`操作对分组后的文档中的某个字段进行求和计算,接着使用`$sort`操作对求和结果进行排序,最后使用`$limit`操作限制返回的文档数量。 需要注意的是,具体的聚合查询语法可能会根据具体的需求而有所不同,上述示例仅供参考。在实际使用中,需要根据具体的字段和操作来构建合适的聚合查询语句。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【详细教程】一文参透MongoDB聚合查询](https://blog.csdn.net/bxg_kyjgs/article/details/125803527)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宝山的博客

谢谢你的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值