一 数组相关
1.进入my_test数据库
use my_test
2.向数据库的users集合中插入一个username为sunwukong的文档
db.users.insert({username:"sunwukong"})
3.向数据库的users集合中插入一个{username:"zhubajie"}和一个{username:'shaheshang",address:"liushahe"}的两个文档
db.users.insert([{username:"zhubajie"},{username:”shaheshang",address:"liushahe"}])
db.users.insertMany([{username:"zhubajie"},{username:'shaheshang",address:"liushahe"}])
4.查询数据库users集合中的文档
db.users.find()
5. 统计数据库users集合中的文档数量
db.users.count()
6. 查询数据库users集合中username为sunwukong的文档
db.users.find({username:"sunwukong"})
7. 向数据库users集合中的username为sunwukong的文档,添加一个address属性,属性值为huaguoshan
db.users.update({username:"sunwukong"},{$set:{address:"huangongshan"}})
8. 使用{username:"tangseng"} 替换 username 为 zhubajie的文档
db.users.update({username:"zhubajie"},{username:"tangseng"})
9. 删除username为shaheshang的文档的address属性
db.users.update({username:"shaheshang"},{$unset:{address:""}})
10.删除address为huanguoshan的文档
db.users.remove({address:"huaguoshan"})
11.向username为sunwukong的文档中,添加一个hobby{cities[beijing,shanghai,shenzhen] , movies[sanguo,hero]}
--MongoDB的文档属性值也可以是一个文档,当一个文档的属性值是一个文档时,称这个文档为“内嵌文档”
db.users.update({username:"sunwukong"},{$set:{hobby:{cities:["beijing","shanghai","shenzhen"], movies:["sanguo","hero"]}}})
12.向username为tangseng的文档中,添加一个hobby{movies[A Chinese Odyssey,King of comedy]}
db.users.update({username:"tangseng"},{$set:{hobby:{movies:["A Chinese Odyssey","King of comedy"]}}})
13.查询喜欢电影hero的文档
--MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式来匹配
--如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号
db.users.find({"hobby.movies":"hero"})
14.向tangseng中添加一个新的电影Interstellar
--$push 向数组中添加一个新的元素,如果数组中已经存在了该元素,也会添加
--$addToSet 向数组中添加一个新的元素,如果数组中已经存在了该元素,则不会添加
db.users.update({username:"tangseng"},{$push:{"hobby.movies":"Interstellar"}})
15.删除喜欢beijing的用户
db.users.remove({"hobby.cities":"beijing"})
16.删除user集合
db.users.drop()
--补充:从数组中删除元素
db.users.update({username:"tangseng"},{$pop:{"hobby.movies":1}})
db.users.update({username:"tangseng"},{$pull:{"hobby.movies":"Interstellar"}})
db.users.update({username:"tangseng"},{$pullAll:{"hobby.movies":["Interstellar",”hero”]}})
--$pop:属性值为1删除数组中的最后一个元素,值为-1删除数组中的第一个元素
--$pull:删除属性值指定的元素
--$pullAll:属性值是一个数组,删除属性值数组中的所有元素
17.向numbers中插入20000条数据
---方法一:
for(var i=1;i<=20000;i++)
{
db.numbers.insert({num:i});
}
----方法二:
var arr=[]
for(var i=1;i<=20000;i++)
{
arr.push({num:i});
}
db.numbers.insert(arr)
18.查询numbers中num为500的文档
db.numbers.find({num:500})
19.查询numbers中num大于5000的文档
db.numbers.find({num:{$gt:500}})
20.查询numbers中num小于30的文档
db.numbers.find({num:{$lt:30}})
21.查询numbers中num大于40小于50的文档
db.numbers.find({num:{$gt:40,$lt:50}})
db.numbers.find({$and:[{num:{$lt:50}},{num:{$gt:40}}]})
22.查询numbers中num大于19996的文档
db.numbers.find({num:{$gt:19996}})
23.查看numbers集合中的前10条数据
--limit()设置显示数据的上限
db.numbers.find().limit(10)
24.查看numbers集合中的第11条到20条数据
--skip()用于跳过指定数量的数据
db.numbers.find().skip(10).limit(10)
25.查看numbers集合中的第21条到30条数据
db.numbers.find().skip(20).limit(10)
--MongoDB会自动调整skip()和limit()的顺序,所以skip()和limit()反过来也可以
二 insert与find基本操作
1.在s集合中插入以下数据。(insert、insertOne、insertMany都试试)
2.查询学号为1001同学的姓名
db.s.find({sno:"1001"},{sname:1})
3.查询学生的人数
db.s.find().count()
4.查询18岁的lisi的学号和姓名
db.s.find({"age":18,"sname":"lisi"},{sno:1,sname:1,_id:0})
5.查询zhangsan及所有18岁同学的信息
db.s.find({$or:[{sname:"zhangsan"},{age:18}]})
6.查询年龄为11或18岁的同学的姓名
db.s.find({$or:[{age:11},{age:18}]},{sname:1,_id:0})
7.查询第一个文档
db.s.findOne()
8.查询第五个文档
db.s.find()[4]
三 update和remove操作
1.复制集合s,新集合名称为sbak。在sbak中完成以下操作
db.s.find({}).forEach(function(x){db.sbak.insert(x)})
2 修改学号为1001同学的年龄为20岁
db.sbak.update({sno:"1001"},{$set:{sage:20}})
3.所有男同学的文档增加addr属性,值为“hebei”
db.sbak.update({ssex:"nan"},{$set:{addr:"hebei"}},{multi:true,upsert:true})
4.删除wangwu同学的年龄属性
db.sbak.update({sname:"wangwu"},{$unset:{sage:22}})
5.修改zhangsi同学的年龄属性为20,如果没有满足条件的则插入这个文档
db.sbak.update({sname:"zhangsi"},{$set:{sage:20}},{multi:true,upsert:true})
6.修改所有文档的sage属性为age
db.sbak.update({},{$rename:{"sage":"age"}},{multi:true})
7.修改所有男生的年龄为原来的2倍
db.sbak.update({ssex:"nan"},{$mul:{age:2}},{multi:true})
8.修改所有女生的年龄加1岁
db.sbak.update({ssex:"nv"},{$inc:{age:1}},{multi:true})
9.删除年龄小于18岁的文档
db.sbak.remove({age:{$lt:18}})
10.删除sbak中的所有文档
db.s.remove({})
四 高级查询
1.查询第2到第5个文档
db.s.find().skip(1).limit(5)
2.男生按年龄的降序排序
db.s.find({ssex:"nan"}).sort({sage:-1})
3.统计18岁(含)以下的学生人数
db.s.find({sage:{$lte:18}}).count()
4.显示女生的姓名和年龄
db.s.find({ssex:"nv"},{sname:1,sage:1,_id:0})
5.查询年龄最大的两个男生的姓名
db.s.find({ssex:"nan"},{sname:1,_id:0}).limit(2).sort({sage:-1})
6.给学号按升序创建一个唯一索引
db.s.createIndex({sno:1},{unique:true}) db.s.getIndexes()
7.查询16岁以上学生的性别(重复的只显示一次)
db.s.distinct("ssex",{sage:{$gt:16}})
8.查询姓名包含字母“i”的学生
db.s.find({sname:/i/})
五 文档之间的关系
1.查询工资小于2000的员工
db.emp.find({sal:$lt:2000})
2.查询工资在1000-2000之间的员工
db.emp.find({sal:{$lt:2000,$gt:1000}})
3.查询工资小于1000或大于2500的员工
db.emp.find({$or:[{sal:{$lt:1000}},{sal:{$gt:2500}}]})
4.查询财务部的所有员工
db.emp.find({depno:db.dept.find({dname:"财务部"})[0].deptno})
5.查询销售部的所有员工
db.emp.find({depno:db.dept.find({dname:"销售部"})[0].deptno})
6.查询所有mgr为7698的所有员工
db.emp.find({mgr:7698})
7.为所有薪资低于1000的员工增加工资400元
db.emp.updateMany({sal:{$lt:1000}},{$inc:{sal:400}})
8.为薪资最高的员工增加工资1元
db.emp.update({
empno:
db.emp.find({}).sort({sal:-1}).limit(1)[0].empno
},{$inc:{sal:1}
})
六 MongoDB综合练习
在MongoDB的gk集合里插入以下数据:
1.查询张三同学的成绩信息
db.gk.find({sname:"张三"},{sname:1,成绩:1},{_id:0})
2.查询李四同学的语文成绩
db.gk.find({sname:"李四"},{"成绩.语文":1},{_id:0})
3.查询没有选化学的同学
db.gk.find({"成绩.化学":null},{sname:1},{_id:0})
4.统计语文成绩的平均分
db.gk.aggregate([{$group:{_id:"",agerage:{$avg:"$成绩.语文"}}}])
5.查询英语成绩最高的同学
db.gk.find({},{sname:1},{_id:0}).limit(1).sort({"成绩.英语":-1})
6.求每个同学语数英三门课的总成绩
db.gk.aggregate([
{ "$project": {"classes": [ "$成绩.数学", "$成绩.语文", "$成绩.英语"]}},
{ "$unwind": "$classes" },
{ "$group": {"_id": "$_id","classes": { "$sum": "$classes" }}}])
七 数据查询和正则表达式
1.查询年龄大于20的zhaoliu的学生信息
db.s.find({sname:"zhaoliu",sage:{$gt:20}})
2.查询年龄在18到20岁之间的学生信息
db.s.find({sage:{$lte:20},{sage:{$gte:18}}})
3.查询年龄小于18或大于60的学生信息
db.s.find({$or:[{sage:{$gt:60}},{sage:{$lt:18}}]})
4.查询年龄为18和20岁的学生信息
db.s.find({$or:[{sage:18},{sage:20}]})
5.查询年龄不为18和20岁的学生信息
db.s.find({$or:[{sage:{$ne:18}},{sage:{$ne:20}}]}
6.查询姓名中包含“wang”的同学
db.s.find({"sname":{$regex:/wang/}})
7.查询姓“wang”的同学
db.s.find({"sname":{$regex:/^wang/}})
8.查询姓名的最后一个字为“i”的同学
db.s.find({"sname":{$regex:/i^/}})
9.查询姓名中包含“AN”的同学(不区分字母大小写)
db.s.find({"sname":{$regex:/AN/i}})