摘要:主要写了mongodb数据操作命令,以及注意事项;涉及创建数据库,创建集合,删除集合,运算符,正则表达式,投影,排序,聚合,管道,索引等示例代码
moongodb数据库
创建数据库:
use test1
db.test1.insert({name:"hello"})
#创建数据库的时候,必选要有数据才能查询到
删除数据库
db.dropDatabase()
创建集合,就相当于创建表
在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
db.test1.insert({name:"创建集合"})
db.createCollection("runoob")
创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
db.createCollection("mycol", { capped : true, autoIndexId : true, size :
... 6142800, max : 10000 } )
删除集合
db.test1.drop()
- 增删改查
- 插入数据:
db.mymongo.insert({id:1,name:"derek",sex:"nan"})
db.mymongo.save({"_id":1,"age":234}) 如果存在就会更改对应的值或者添加
- 更新数据,就是改
db.mymongo.update({"name":"hello"},{$set:{"name":"derek"}})
db.mymongo.update({"name":"wwww"},{$set:{"name":"王亚东"}},{multi:true}) #加上multi,更改多行
db.stu.update({name:'hr'},{name:'mnc'}) 更新一条
db.stu.update({name:'hr'},{$set:{name:'hys'}}) 更新一条
db.stu.update({},{$set:{gender:0}},{multi:true}) 更新全部
- 删除数据
db.col.remove({}) 删除集合中所有数据
db.col.remove({"name":"wangyadong"}) 删除指定数据
db.col.deleteMany({status:"A"}) 删除等于A的数据
db.col.deleteOne({status:"A"}) 删除等于A的一条数据
- 查询数据
db.col.find().pretty() 美化输出
db.stu.findOne({age:{$nin:[16,18]}}) 输入一条数据
比较运算符
db.col.find({likes:{$gt:50}}).pretty() 查询大于50
db.col.find({likes:{$gte:69}}).pretty() 查询大于等于69
db.col.find({likes:{$lt:20}}).pretty() 查询小于20
db.col.find({likes:{$lte:13}}).pretty() 查询小于13
db.col.find({likes:{$ne:13}}).pretty() 查询不等于13
逻辑运算符
db.col.find({$or:[{"likes":13,"likes":612}]}).pretty() or或,满足一个
db.col.find({title:"MongoDB 教程",likes:69}).pretty() and与,同时满足
范围运算符
db.stu.find({age:{$in:[16,18]}}) 包含16,18
db.stu.find({age:{$nin:[16,18]}}) 不包含16,18
正则表达式
db.stu.find({name:{$regex:"^段"}}) 查询以段开头
db.stu.find({name:{$regex:"段"}}) 查询包含段
db.stu.find({name:{$regex:"段$"}}) 查询以段结尾
db.stu.find({name:/段/}) 查询包含段
db.stu.find({name:/^段/}) 查询以段开头
db.stu.find({name:/段$/}) 查询以段结尾
MongoDB 操作符 - $type 实例
db.col.find({title:{$type:2}}) 获取集合中的title为string的数据
limit和skip
db.col.find().limit(2) 查询2条信息
db.stu.find().skip(2) 跳过2条信息
db.stu.find().limit(2).skip(2) 查询2条信息跳过
db.stu.find().skip(2).limit(2) 这两种写法都是先跳后查,用最后一个
投影
db.stu.find({},{_id:0}) 第一个 {} 放 where 条件,为空表示返回集合中所有文档。第二个 {} 指定那些列显示和不显示 (0表示不显示 1表示显示)。
db.stu.find({age:{$gt:18}},{_id:0,name:1})
排序
#根据性别降序, 再根据年龄升序
db.stu.find().sort({gender:-1,age:1}) 1为升序,-1为降序
db.stu.find({},{_id:0,name:1}).sort({age:-1}) 查询集合,id不显示,只显示name,按照age降序
统计个数
db.stu.find({age:18}).count() 查询age等于18有几条数据
db.stu.count({age:{$gt:18}}) 查询age大于18有几条数据
db.stu.count({age:{$gt:15},gender:false}) 查询age大于15且gender等于false
消除重复
⽅法distinct()对数据进⾏去重
db.集合名称.distinct('去重字段',{条件})
db.stu.distinct('hometown',{age:{$gt:18}}) 对age大于18,hometown进行去重 返回一个数组
聚合 aggregate
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
db.集合名称.aggregate({管道:{表达式}})
常用管道如下:
在mongodb中,⽂档处理完毕后, 通过管道进⾏下⼀次处理
$group: 将集合中的⽂档分组, 可⽤于统计结果
$match: 过滤数据, 只输出符合条件的⽂档
$project: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
$sort: 将输⼊⽂档排序后输出
$limit: 限制聚合管道返回的⽂档数
$skip: 跳过指定数量的⽂档, 并返回余下的⽂档
$unwind: 将数组类型的字段进⾏拆分
表达式
处理输⼊⽂档并输出
语法:表达式:'$列名'
常⽤表达式:
$sum: 计算总和, $sum:1 表示以⼀倍计数
$avg: 计算平均值
$min: 获取最⼩值
$max: 获取最⼤值
$push: 在结果⽂档中插⼊值到⼀个数组中
$first: 根据资源⽂档的排序获取第⼀个⽂档数据
$last: 根据资源⽂档的排序获取最后⼀个⽂档数据
$ group
#将集合中的文档分组,可用于统计结果
#_id用于分组标识 必须要有,使用某个字段的格式,$字段名
db.stu.aggregate({$group:{_id:"$age",sum:{$sum:1}}}) group分组,对age分组后的数据进行统计
#统计全班人数,和求全班平均年龄
db.stu.aggregate({$group:{_id:"",count:{$sum:1},avg:{$avg:"$age"}}})
#统计全班男女人数
db.stu.aggregate({$group:{_id:"$gender",count:{$sum:1}}})
#统计男女平均年龄
db.stu.aggregate({$group:{_id:"$gender",count:{$avg:"$age"}}})
透视数据
将分组后的数据,放进结果集列表中
db.stu.aggregate({$group:{_id:"$gender",count:{$push:"$name"}}}) 如果是字段名,结果集只显示这个字段的数据
db.stu.aggregate({$group:{_id:"$gender",count:{$push:"$$ROOT"}}}).pretty() 如果是$$ROOT,它会文档内容放进结果集数组中
根据三个字段分组去重
db.tv3.aggregate({$group:{_id:{country:"$country",province:"$province",userid:"$userid"}}})
需求:统计出每个country/province下的userid的数量(同一个userid只统计一次)
db.tv3.aggregate({$group:{_id:{country:"$country",province:"$province",userid:"$userid"}}},
{$group:{_id:{country:"$_id.country",province:"$_id.province"},count:{$sum:1}}},
{$project:{_id:0,country:"$_id.country",province:"$_id.province",count:"$count"}}) ### match
用作条件过滤,只输出符合条件的文档
查询年龄大于15的男女人数
db.stu.aggregate({$match:{age:{$gt:15}}},{$group:{_id:"$gender",count:{$sum:1}}})
查询男女人数,输出人数
db.stu.aggregate({$group:{_id:"$gender",count:{$sum:1}}},{$project:{_id:0,count:1}}) ### $sort
对结果进行排序后输出
db.tv3.aggregate({$group:{_id:{country:"$country",province:"$province",userid:"$userid"}}},
{$group:{_id:{country:"$_id.country",province:"$_id.province"},count:{$sum:1}}},
{$project:{_id:0,country:"$_id.country",province:"$_id.province",count:"$count"}},
{$sort:{count:-1}})
limit
限制管道返回的的文档数量
db.stu.aggregate({$limit:2}) ### skip
跳过指定的文档,返回余下的文档
db.stu.aggregate({$skip:3},{$limit:2})
顺序不能乱,先写skip,再写limit ### $unwind
将⽂档中的某⼀个数组类型字段拆分成多条, 每条包含数组中的⼀个值
语法:db.集合名称.aggregate({$unwind:'$字段名称'})
db.t2.aggregate({$unwind:"$size"})
db.t2.aggregate({$unwind:"$tags"},{$group:{_id:null,counter:{$sum:1}}})
{ "_id" : null, "counter" : 3 }
创建索引
之前的方法
db.col.ensureIndex({name:1})
最新创建方法
db.col.createIndex({name:1})
#索引对应的值可以不不唯⼀一 创建唯⼀一索引,插入两条一样报错
db.col.createIdenx({name:1}, {unique:true})
db.col.ensureIndex({name: 1}, {unique: true});
#创建复合索引
db.col.createIndex({name:1,age:-1})
#使⽤用场景:⼀一个字段不不能够唯⼀一的确定⼀一条数据时
#查看当前集合的所有索引:
db.t1.getIndexes()
#删除索引:
db.t1.dropIndex({'索引名称':1})