数据库命名规范

  1. 1.不能是空字符串
  2. 2.不得含有特殊字符
  3. 3.应全部小写
  4. 4.最多64个字节
  5. 5.数据库名不能与现有系统保留库同名,如admin,local

MongoDB的增删改查

mongoDB中一张表称为一个集合

mongoDB插入数据

db.集合名.insert({}) 数据格式为json,id不能重复,支持多条插入数据库

单条插入数据

  1. db.jerry_collection.insert({x:1})

多条插入数据

  1. for(i=3;i<10;i++)db.jerry_collection.insert({x:i})

mongodb的保存

命令:db.集合名称.save(document)

  1. db.stu.save({_id:ObjectId("5f169b37d74866264ed9a7db"), name:'gj', gender:2})
  2. db.stu.save({name:'gj', gender:2})
  3. db.stu.find()

MongoDB查询数据

测试数据

  1. db.stu.insert([{"name" : "张三", "hometown" : "长沙", "age" : 20, "gender" : true },
  2. {"name" : "老李", "hometown" : "广州", "age" : 18, "gender" : false },
  3. {"name" : "王麻子", "hometown" : "北京", "age" : 18, "gender" : false },
  4. {"name" : "刘六", "hometown" : "深圳", "age" : 40, "gender" : true },
  5. {"name" : "jerry", "hometown" : "长沙", "age" : 16, "gender" : true },
  6. {"name" : "小永", "hometown" : "广州", "age" : 45, "gender" : true },
  7. {"name" : "老amy", "hometown" : "衡阳", "age" : 18, "gender" : true }])

查询所有数据

  1. db.jerry_collection.find({条件⽂档})

⽅法pretty():将结果格式化

  1. db.集合名称.find({条件⽂档}).pretty()

查询单条数据

  1. db.jerry_collection.findOne({条件⽂档})

带有条件的查询

  1. 查询x等于100的数据
  2. db.jerry_collection.find({x:100})
  3. 查询x等于100y等于99
  4. db.jerry_collection.find({x:100,y:99})

比较运算符

  1. 等于:默认是等于判断,没有运算符
  2. 小于:$lt
  3. 小于等于:$lte
  4. 大于:$gt
  5. 大于等于:$gte
  6. 查询y大于等于18的数据
  7. db.jerryn_collection.find({y:{$gte:18}})

范围运算符

  1. 使用$in,$nin判断是否在某个范围内查询年龄为1828的学生
  2. db.jerry_collection.find({age:{$in:[18,28]}})

逻辑运算符

  1. or:使用$or,值为数组,数组中每个元素为json
  2. db.jerry_collection.find({$or:[{age:{$gt:18}},{gender:false}]})

自定义查询

mongo shell 是一个js的执行环境 使用$where 写一个函数, 返回满足条件的数据

  1. 查询年龄大于30的学生
  2. db.jerry_collection.find({
  3. $where:function() {
  4. return this.age>30;}
  5. })

查询结果操作

查出的数据求总数

  1. db.jerry_collection.find().count()

limit和skip

  1. limit用于读取指定数量的文档
  2. db.jerryn_collection.find().limit(2)
  3. skip用于跳过指定数量的文档
  4. db.jerry_collection.find().skip(2)
  5. limitskip同时使用
  6. db.jerry_collection.find().skip(2).limit(2)

映射

指定返回的字段,如果为1则返回改字段,如果为0则除了改字段外所有字段返回。id如果没写会默认返回

  1. db.jerry_collection.find({},{_id:1})

排序

  1. 按照年龄升序排序
  2. db.jerry_collection().find().sort({age:1})
  3. 按照年龄降序排序
  4. db.jerry_collection().find().sort({age:-1})

修改数据

  1. db.集合名称.update({query}, {update}, {multi: boolean})
  • 参数query:查询条件
  • 参数update:更新操作符
  • 参数multi:可选,默认是false,表示只更新找到的第一条数据,值为true表示把满足条件的数据全部更新
  1. db.jerry_collection.insert({x:100,y:100,z:100})
  2. { "_id" : ObjectId("59b297dd8fa0c171faae5bc8"), "x" : 100, "y" : 100, "z" : 100 }
  3. db.jerry_collection.update({x:100},{y:99})
  4. 修改后数据变为
  5. { "_id" : ObjectId("59b297dd8fa0c171faae5bc8"), "y" : 99 }
  6. 部分更新
  7. db.jerry_collection.update({x:100},{$set:{y:99}})
  8. 如果y:100数据不存在,就插入y:101这条数据,第三个参数为true
  9. db.jerry_collection.update({y:100},{y:101},true)
  10. 更新多条
  11. db.jerry_collection.update({y:99},{$set:{y:101}},{multi:true})

删除数据

  1. db.jerry_collection.remove({条件},{justOne:true}) mongoDB为了防止误删除,条件必须写
  2. db.jerry_collection.remove() 删除所有数据,索引不会删除
  3. db.jerry_collection.remove({x:100})

删除表

  1. db.jerry_collection.drop()

练习

  1. 测试数据
  2. var persons = [{
  3. name:"jim",
  4. age:25,
  5. email:"75431457@qq.com",
  6. c:89,m:96,e:87,
  7. country:"USA",
  8. books:["JS","C++","EXTJS","MONGODB"]
  9. },
  10. {
  11. name:"tom",
  12. age:25,
  13. email:"214557457@qq.com",
  14. c:75,m:66,e:97,
  15. country:"USA",
  16. books:["PHP","JAVA","EXTJS","C++"]
  17. },
  18. {
  19. name:"lili",
  20. age:26,
  21. email:"344521457@qq.com",
  22. c:75,m:63,e:97,
  23. country:"USA",
  24. books:["JS","JAVA","C#","MONGODB"]
  25. },
  26. {
  27. name:"zhangsan",
  28. age:27,
  29. email:"2145567457@qq.com",
  30. c:89,m:86,e:67,
  31. country:"China",
  32. books:["JS","JAVA","EXTJS","MONGODB"]
  33. },
  34. {
  35. name:"lisi",
  36. age:26,
  37. email:"274521457@qq.com",
  38. c:53,m:96,e:83,
  39. country:"China",
  40. books:["JS","C#","PHP","MONGODB"]
  41. },
  42. {
  43. name:"wangwu",
  44. age:27,
  45. email:"65621457@qq.com",
  46. c:45,m:65,e:99,
  47. country:"China",
  48. books:["JS","JAVA","C++","MONGODB"]
  49. },
  50. {
  51. name:"zhaoliu",
  52. age:27,
  53. email:"214521457@qq.com",
  54. c:99,m:96,e:97,
  55. country:"China",
  56. books:["JS","JAVA","EXTJS","PHP"]
  57. },
  58. {
  59. name:"piaoyingjun",
  60. age:26,
  61. email:"piaoyingjun@uspcat.com",
  62. c:39,m:54,e:53,
  63. country:"Korea",
  64. books:["JS","C#","EXTJS","MONGODB"]
  65. },
  66. {
  67. name:"lizhenxian",
  68. age:27,
  69. email:"lizhenxian@uspcat.com",
  70. c:35,m:56,e:47,
  71. country:"Korea",
  72. books:["JS","JAVA","EXTJS","MONGODB"]
  73. },
  74. {
  75. name:"lixiaoli",
  76. age:21,
  77. email:"lixiaoli@uspcat.com",
  78. c:36,m:86,e:32,
  79. country:"Korea",
  80. books:["JS","JAVA","PHP","MONGODB"]
  81. },
  82. {
  83. name:"zhangsuying",
  84. age:22,
  85. email:"zhangsuying@uspcat.com",
  86. c:45,m:63,e:77,
  87. country:"Korea",
  88. books:["JS","JAVA","C#","MONGODB"]
  89. }]
  90. for(var i = 0;i<persons.length;i++){
  91. db.persons.insert(persons[i])
  92. }
  93. var persons = db.persons.find({name:"jim"})
  94. while(persons.hasNext()){
  95. obj = persons.next();
  96. print(obj.books.length)
  97. }

题目

1.查询年龄大于25小于27的name,age
2.查询出不是美国的name
3.查询国籍是中国或者美国的学生信息
4.查询语文成绩大于85或者英语成绩大于90的学生信息
5.查询出名字中存在”li”的学生信息
6.查询喜欢看MONGODB和PHP的学生
7.查询第二本书是JAVA的学生信息
8.查询喜欢的书数量是4本的学生
9.查询出persons中一共有多少国家分别是什么

聚合

聚合是基于数据处理的聚合管道,每个文档通过一个由多个阶段组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果

image.png

常用的管道

  1. $group:将集合中的文档分组,可用于统计结果
  2. $match:过滤数据,只输出符合条件的文档
  3. $sort:将输入文档排序后输出
  4. $limit:限制聚合管道返回的文档书
  5. $skip:跳过指定数量的文档,并返回余下的文档

测试数据

  1. db.stu.insert({name:"a", hometown: '东北', age: 20, gender: true})
  2. db.stu.insert({name:"b", hometown: '长沙', age: 18, gender: false})
  3. db.stu.insert({name:"c", hometown: '武汉', age: 18, gender: false})
  4. db.stu.insert({name:"d", hometown: '华山', age: 40, gender: true})
  5. db.stu.insert({name:"e", hometown: '山东', age: 16, gender: true})
  6. db.stu.insert({name:"f", hometown: '江苏', age: 45, gender: true})
  7. db.stu.insert({name:"g", hometown: '大理', age: 18, gender: true})

表达式

处理输⼊⽂档并输出
语法:表达式:’$列名’
常⽤表达式:

  1. $sum 计算总和, $sum:1 表示以⼀倍计数
  2. $avg 计算平均值
  3. $min 获取最⼩值
  4. $max 获取最⼤值
  5. $push 在结果⽂档中插⼊值到⼀个数组中
  6. $first 根据资源⽂档的排序获取第⼀个⽂档数据
  7. $last 根据资源⽂档的排序获取最后⼀个⽂档数据

$group

将集合中的文档分组,课用于统计结果

  • _id表示分组的依据,使用某个字段的格式为 ‘$字段’

按照gender分组,获取不同组的平均年龄

  1. db.students.aggregate(
  2. {$group:{_id:'$gender',count:{$sum:1},avg_age:{$avg:"$age"}}}
  3. )

$match

match是管道命令,能将结果交给后一个管道

查询年龄大于20的学生

  1. db.students.aggregate(
  2. {$match:{age:{$gt:20}}}
  3. )

Mongodb创建索引

1. 为什么mongdb需要创建索引

  • 加快查询速度
  • 进行数据的去重

2. mongodb创建简单的索引方法

  • 语法:db.集合名.ensureIndex({属性:1}),1表示升序, -1表示降序

3. 创建索引前后查询速度对比

测试:插入10万条数据到数据库中

插入数据

  1. for(i=0;i<100000;i++){db.test.insert({name:'test'+i,age:i})}

创建索引前

  1. db.test.find({name:'test9999'})
  2. db.test.find({name:'test9999'}).explain('executionStats') # 显示查询操作的详细信息

创建索引

  1. db.test.ensureIndex({name:1})

创建索引后

  1. db.test.find({name:'test9999'}).explain('executionStats')

4. 索引的查看

默认情况下_id是集合的索引
查看方式:db.集合名.getIndexes()

5. 删除索引

语法:db.集合名.dropIndex({'索引名称':1})

  1. db.test.dropIndex({name:1})
  2. db.test.getIndexes()