基础命令
- 查看当前的数据库:
db
- 查看所有的数据库:
show dbs /show databases
- 切换数据库:
use db_name
- 删除当前的数据库:
db.dropDatabase()
关于集合的基础命令
- 不手动创建集合:向不存在的集合中第一次加入数据时,集合会被创建出来
- 手动创建
db.createCollection(name,options) db.createCollection("stu") db.createCollection("sub",{capped:true,size:10}) 参数capped:默认值为false表示不设置上限,值为true表示设置上限 参数size:当capped值为true时,需要指定此参数,表示上限大小,当 文件达到上限时,会将之前的数据覆盖,单位为字节
- 查看集合:
show collections
- 删除集合:
db.集合名字.drop()
数据类型
- Object ID:文档ID
- String:字符串,最常用,必须是有效的UTF-8
- Boolean:存储一个布尔值,true或者false
- Integer:整数可以是32位或者64位,这取决于服务器
- Double:存储浮点型
- Arrays:数组或者列表,多个值存储到一个键
- Object:用于嵌入式文档,及一个值为一个文档
- Null:存储Null值
- Timestamp:时间戳,表示从1970-1-1到现在的总秒数
- Date:存储当前日期或者UNIX时间格式
插入
- db.集合名称.insert(document)
- db.stu.insert({name:"test",age:10})
- db.stu.insert({_id:"202007131742",name:"de",age:1)
- 插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectId
保存
- db.集合名称.save(document)
- 如果文档的_id已经存在则修改,如果文档的_id不存在则添加
更新
db.集合名称.update(<query>,<update>,{<multi:<boolean>>})
db.stu.update({name:"hr"},{name:"mmp"}) 更新一条(替换,其他属性会缺失) db.stu.update({name:"hr"},{$set:{name:"mmp"}}) 更新一条 db.stu.update({},{$set:{age:10}},{multi:true}) 更新全部
- query:查询条件
- update:更新操作符
- multi:可选,默认时false,表示只更新找到的第一条记录,true表示把满足条件的文档全部更新
删除
db.集合名称.remove(<query>,{justOne:<boolean>})
- query:可选,删除的文档的条件
- justOne:可选,默认时false,表示删除多条,设置为true或1,则只删除一条
查询
- 方法find():查询-->db.集合名称.find({查询条件})
- 方法 findOne():查询,只返回第一条-->db.集合名称.findOne({查询条件})
- 方法 pretty():将结果格式化-->db.集合名称.find({查询条件}).pretty()
比较运算符
- 等于:默认是等于判断,没有运算符
- 小于:$lt(less than)
- 小于等于:$lte(less than equal)
- 大于:$gt(greater than)
- 大于等于:$gte(greater than equal)
- 不等于:$ne(no equal)
- db.stu.find({age:{$lte:10}})
范围运算符
- 在某个范围:$in
- 不在某个范围:$nin
- db.stu.find({age:{$in:[18,28,38]}})
逻辑运算符
- and:在json中写多个条件即可
- or:使用$or,值为数组,数组中每个元素为json
- 年龄大于等于18,且性别为true:db.stu.find({age:{$gte:18},gender:true})
- 年龄大于18,或性别为false:db.stu.find({$or:[age:{$gte:18},gender:false]})
- 年龄大于18,或性别为false,且名字时"test":db.stu.find({$or:[age:{$gte:18},gender:false],name:"test"})
正则
- 使用//或者$regex编写正则表达式
- 以abc开头的:db.stu.find({sku:/^abc/})
- 以123结尾的:db.stu.find({sku:{$regex:"123$"}})
limit和skip
- limit():用于读取指定数量的文档-->db.stu.find().limit(4)
- skip():用于跳过指定数量的文档-->db.stu.find().skip(5)
- 同时使用-->db.stu.find().limit(4).skip(5)或db.stu.find().skip(5).limit(4)(翻页)
自定义查询*
- 使用$whert后面写一个函数,范围满足条件的数据
- db.stu.find({$where:function(){return this.age>30;}})
- db.stu.find().sort({age:1}) 按年龄排序:1升序,-1降序
- db.stu.find().count()或db.stu.count() 统计数量
- db.stu.distinct("name",{age:{$gt:18}}) 消除重复(去除大于18、名字重复的数据)
投影
- 在查询到的返回结果中,只选择必要的字段
- db.stu.find({},{filed:1,...)
- 参数为字段与值,值为1表示显示,值为0表示不显示
- 特殊:对于_id列默认时显示的,如果不显示需要明确设置为0
- 其他字段,如果不显示不写,不能写0
数据的备份和恢复
-
备份数据:
mongodump -h dbhost -d dbname -o dbdirectory
- h:服务器地址,也可以指定端口号
- d:需要备份的数据库名称
- o:备份的数据存放位置,此目录中存放着备份出来的数据
mongodump -h 192.168.1.65:27017 -d test1 -o ~/Desktop/test1bak
-
恢复数据:
mongorestore -h dbhost -d dbname --dir dbdirectory
- h:服务器地址
- d:需要恢复的数据库实例
- dir:备份的数据所在位置
mongorestore -h 192.168.1.65:27017 -d test2 --dir ~/Desktop/test1bak/test1
聚合aggregate
- 聚合时基于数据处理的聚合管道,每个文档通过一个由多个阶段组成的管道,可以对每个阶 段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果
- db.集合名称.aggregate({管道:{表达式}})
db.stu.aggregate([{$match:{status:"A"}}, {$group:{_id:"$cust_id",total:{$sum:"$amount"}}}])
常用管道
- 在mongodb中,文档处理完毕后,通过管道进行下一次处理
- $group:将集合中的文档分组,可用于统计结果
$group
对应的字典里有几个键,结果就有几个键- 分组依据要放到
_id
后面 - 去不同的字段的值需要使用$,如:"$age","$name"
- 取字典嵌套中的值的时候
$_id.age
- 能够同时按照多个键进行分组
{$group:{_id:{age:"$age",name:"$name"}}}
- 结果是:
{_id:{age:18,name:"xiaom"}}
- 结果是:
- $match:过滤数据,只输出符合条件的文档
- $project:修改输入文档结构,如重命名、增加、删除字段、创建计算结果
- $sort:将输入的文档排序后输出
- $limit:限制聚合管道返回的文档数
- $skip:跳过指定数量的文档,并返回余下的文档
- $unwind:将数组类型的字段进行拆分
表达式
- 处理输入文档并输出
- 语法:表达式:"$列名"
- $sum:计算总和,$sum:1表示以一倍计数
- $avg:计算平均值
- $min:获取最小值
- $max:获取最大值
- $push:在结果文档中插入值到一个数组中
- $first:根据资源文档的排序获取第一个文档数据
- $last:根据资源文档的排序获取最后一个文档数据