MongoDB数据的增删改查
说到MongoDB的增删改查,首先要知道MongoDB中的三要素
- 数据库,相似于mysql中的数据库
- 集合,相似于mysql中的表
- 文档,相似于mysql中表的记录
一、插入数据
-
db.集合名称.insert(document)
db.stu.insert({name:'小龙女',gender:1}) db.stu.insert({_id:"20170101",name:'刘德华',gender:1})
插入文档时, 如果不指定_id参数, MongoDB会为文档分配一个唯一的ObjectId类型的_id
插入单条指定为字典, 插入多条时需要指定为列表
保存
db.集合名称.save(document)
如果文档的_id已经存在则修改, 如果文档的_id不存在则添加
- save区别于insert: insert中文档的_id已经存在如果存在直接报错
二、查询:
- 简单查询:db.集合名称.find()
高级查询
查询数据准备
db.stu.drop() db.stu.insert({_id : 1, name:'郭靖',hometown:'蒙古',age:20,gender:true}) db.stu.insert({_id : 2, name:'黄蓉',hometown:'桃花岛',age:18,gender:false}) db.stu.insert({_id : 3, name:'华筝',hometown:'蒙古',age:18,gender:false}) db.stu.insert({_id : 4, name:'黄药师',hometown:'桃花岛',age:40,gender:true}) db.stu.insert({_id : 5, name:'段誉',hometown:'大理',age:16,gender:true}) db.stu.insert({_id : 6, name:'段王爷',hometown:'大理',age:45,gender:true})
数据查询
-
方法find(): 查询
- db.集合名称.find({条件文档})
-
方法findOne():查询,只返回第一个
- db.集合名称.findOne({条件文档})
-
方法pretty(): 将结果格式化
- db.集合名称.find({条件文档}).pretty()
举例:
//查找所有女生
db.stu.find({gender:false})
//查找一个女生
db.stu.findOne({gender:false})
// 查找所有的女生并格式化显示
db.stu.find({gender:false}).pretty()
比较运算符
- 等于: 默认是等于判断, 没有运算符
- 小于:$lt (less than)
- 小于等于:$lte (less than equal)
- 大于:$gt (greater than)
- 大于等于:$gte
- 不等于:$ne
- 举例:
// 查找年龄等于18岁的学生
db.stu.find({age:18})
// 查找年龄小于18岁的学生
db.stu.find({age:{$lt: 18}})
// 查找年龄小于等于18岁的学生
db.stu.find({age:{$lte: 18}})
// 查找年龄大于18岁的学生
db.stu.find({age:{$gt: 18}})
// 查找年龄大于等于18岁的学生
db.stu.find({age:{$gte: 18}})
// 查找年龄不等于18岁的学生
db.stu.find({age:{$ne: 18}})
逻辑运算符
-
and:在json中写多个条件即可
查询年龄大于或等于18, 并且性别为true的学生
db.stu.find({age:{$gte:18},gender:true})
-
or:使用$or, 值为数组, 数组中每个元素为json
查询年龄大于18, 或性别为false的学生
db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})
-
混合查询
查询年龄大于18或性别为男性, 并且家乡为大理
db.stu.find({$or:[{age:{$gte:18}},{gender:true}],hometown:'大理'})
范围运算符
- "$in" : 判断在某个范围内
- "$nin" 判断不在某个范围内
-
查询年龄为18或20的学生
db.stu.find({age:{$in:[18,20]}})
-
查询年龄为不为18或20的学生
db.stu.find({age:{$nin:[18,20]}})
-
支持正则表达式(了解)
使用//或$regex编写正则表达式
-
查询姓黄的学生
-
db.stu.find({name:/^黄/})
- 上面这种写法在pymongo中不支持
-
db.stu.find({name:{$regex: '^黄' }})
- 该写法pymongo中支持
-
limit和skip
方法limit(): 用于读取指定数量的文档
-
语法: db.集合名称.find().limit(NUMBER)
- 查询2条学生信息
db.stu.find().limit(2)
方法skip(): 用于跳过指定数量的文档
-
语法: db.集合名称.find().skip(NUMBER)
- 跳过三个学生,查询后面的
db.stu.find().skip(3)
查询学生信息跳过3个学生, 再查询2个学生
-
同时使用:
db.stu.find().limit(2).skip(3)
- 或
-
db.stu.find().skip(3).limit(2)
(推荐)
自定义查询(了解)
- 使用$where后面写一个函数, 返回满足条件的数据
- 举例
- 查询年龄大于30的学生
db.stu.find({
$where:function() {
return this.age>30;}
})
- 注意: 必须使用 return 返回一个值
投影
在查询到的返回结果中, 只选择必要的字段
-
语法: db.集合名称.find({},{字段名称:1,...})
- 参数为字段与值, 值为1表示显示, 值为0不显示, 普通字段不写就是不显示
特殊: 对于_id列默认是显示的, 如果不显示需要明确设置为0, 其他字段不显示不写即可
举例:
-
查询所有学生信息,只显示姓名和年龄
-
db.stu.find({},{name:1,age:1})
- 查询的结果,除了name,age外还有_id类型
-
如何去掉_id字段呢? , 在投影中给_id指定为0
db.stu.find({},{_id:0, name:1, age:1})
-
排序
方法sort(), 用于对 集进行排序
-
语法: db.集合名称.find({文档条件}).sort({字段:1,...})
- 参数1为升序排列
- 参数-1为降序排列
举例:
-
查询所有学生,按年龄升序
db.stu.find().sort({age:1})
-
查询所有学生,按年龄降序
db.stu.find().sort({age:-1})
-
根据性别降序, 再根据年龄升序
db.stu.find().sort({gender:-1,age:1})
统计个数
方法count()用于统计结果集中文档条数
-
语法: db.集合名称.find({条件}).count()
- db.集合名称.count({条件})
举例:
-
查询男生的个数
db.stu.find({gender:true}).count()
db.stu.count({gender:true})
-
统计年龄大于20的男生的个数
db.stu.count({age:{$gt:20},gender:true})
消除重复
方法distinct()对数据进行去重
db.集合名称.distinct('去重字段',{条件})
举例:
-
查询学生的家乡,不能重复
db.stu.distinct('hometown')
-
查询年龄大于20的学生的家乡, 不能重复
db.stu.distinct('hometown',{age:{$gt:20}})
三、更新修改
-
语法: db.集合名称.update( , , {multi: })
参数query:查询条件
参数update:更新操作符
参数multi:可选, 默认是false,表示只更新找到的第一条记录, 值为true表示把满足条件的文档全部更新
-
举例:
-
db.stu.update({name:'hr'},{name:'mnc'}) 更新一条,没有更新的字段会丢弃.
db.stu.update({name:'hr'},{$set:{name:'hys'}}) 更新一条,没有更新的字段不会丢弃.
db.stu.update({},{$set:{gender:0}},{multi:true}) 更新全部
-
注意:"multi update only works with $ operators" 更新全部,必须使用$set
四、删除
-
语法: db.集合名称.remove(,{justOne: })
参数query:可选,删除文档的条件
参数justOne:可选, 如果设为true或1, 则只删除一条, 默认false, 表示删除多条