01. 数据库操作 1. 查看当前数据库名称 db 2. 查看所有数据库名称,列出所有在物理上存在的数据库 show dbs; 3. 切换数据库,如果数据库不存在也并不创建,直到插入数据或创建集合时数据库才被创建 use 数据库名称 4. 删除当前指向的数据库,如果数据库不存在,则什么也不做 db.dropDatabase() 02. 集合操作 01. 创建集合 1. 不限制集合大小 db.createCollection(name) 2. 限制集合大小 db.createCollection(name, { capped : true, size : 10 } ) name 创建的集合名 capped 默认值为false表示不设置上限,值为true表示设置上限 size 当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节 02. 查看当前数据库的集合 show collections 03. 删除集合 db.集合名称.drop() 04. 当前集合的状态 db.集合名.stats() 03. 数据类型 Object ID 文档ID 每个文档都有一个属性,为_id,保证每个文档的唯一性 可以自己去设置_id插入文档 如果没有提供,那么MongoDB为每个文档提供了一个独特的_id,类型为objectID objectID是一个12字节的十六进制数 前4个字节为当前时间戳 接下来3个字节的机器ID 接下来的2个字节中MongoDB的服务进程id 最后3个字节是简单的增量值 String 字符串,最常用,必须是有效的UTF-8 Boolean 存储一个布尔值,true或false Integer 整数可以是32位或64位,这取决于服务器 Double 存储浮点值 Arrays 数组或列表,多个值存储到一个键 Object 用于嵌入式的文档,即一个值为一个文档 Null 存储Null值 Timestamp 时间戳,表示从1970-1-1到现在的总秒数 Date 存储当前日期或时间的UNIX时间格式 创建日期语句如下 注意:参数的格式为YYYY-MM-DD new Date('2017-12-20') 04. 数据的增删改 1. 插入数据(可以不用事先创建集合而直接使用) db.集合名称.insert(document) 2. 更新数据 db.集合名称.update(<query>, <update>, {multi: <boolean>}) query 查询条件 update:更新操作符,类似sql语句update中set部分 1. 当为一个文档时,则用这个文档替换查询到的文档 2. 通过$set更新指定的列{$set:{列:值}},如果列不存在,则会新添加一列。 3. 通过$unset删除指定的字段{$unset:{字段:''}} multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新 3. 保存 db.集合名称.save(document) 如果document指定了_id,则修改,没有指定则添加到集合。 4. 删除数据 db.集合名称.remove(<query>, {justOne: <boolean>}) query 可选,删除的文档的条件 justOne 可选,如果设为true或1,则只删除一条,默认false,表示删除多条 05. 查询 01. 基本查询 1. db.集合名称.find({条件文档}) 根据条件查询 2. db.集合名称.findOne({条件文档}) 只查询一条数据 3. db.集合名称.find({条件文档}).pretty() 将结果格式化 02. 比较运算符 $lt 相当于< 例如:{age:{$lt:20}} 相当于age<20 $lte 相当于<= $gt 相当于> $gte 相当于>= $ne 相当于!= 03. 逻辑运算符 1. 在{}中写的多个条件相当于and {age:18, gerder:false} 相当于age=18 and gender=false 2. 或运算 $or {$or:[{},{}...]} 所有条件写在[]中 04. 范围运算符 $in $nin {age:{$in:[18,20]}} 相当于age=18或者age=20 05. 正则表达式 方法1:正则表达式放在//中 {name:/师$/} name以师结尾 方法2: {name:{$regex:师$}} name以师结尾 06. 自定义查询 使用$where后面写一个js函数,返回满足条件的数据 对集合中所有的数据执行函数,如果返回true,则该条数据有效,否则过滤掉这条数据 如: db.stu.find({ $where:function() { return this.age > 30; } }) 07. 分页查询 db.集合名称.find().skip(m).limit(n) 跳过m条数据选择n条 其中skip()和limit()可以互换位置而不影响结果 08. 投影 在一条文档中选择其中的几个字段 db.集合名称.find({条件},{字段名称:1,...}) _id默认为显示,为0则表示不显示,其他字段若不想显示则不写即可,写为0反而会报错 1表示显示该字段 09. 排序 db.集合名称.find().sort({字段:1,...}) 参数1表示升序 参数-1表示降序 10. 统计个数 写法1: db.集合名称.find({条件}).count() 写法2 db.集合名称.count({条件}) 11. 去重 db.集合名称.distinct('去重字段',{条件}) 06. 聚合 01. 介绍 聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg() 02. 语法 db.集合名称.aggregate({管道:{表达式}}) 管道 在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的输入;在mongodb中,管道具有同样的作用,文档处理完毕后,通过管道进行下一次处理 表达式 '$列表' 处理输入文档并输出 '$列表' 03. 常见管道 01. $group:将集合中的文档分组,可用于统计结果 _id 表示分组的依据,倘若写为Null,则把整个集合当做一组 如:统计男生女生的总人数 db.stu.aggregate( {$group: { _id:'$gender', counter:{$sum:1} } } ) 02. $match:过滤数据,只输出符合条件的文档 如:查询年龄大于20的男生、女生人数 db.stu.aggregate( {$match:{age:{$gt:20}}}, {$group:{_id:'$gender',counter:{$sum:1}}} ) 03. $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果 如:查询男生、女生人数,输出人数 db.stu.aggregate( {$group:{_id:'$gender',counter:{$sum:1}}}, {$project:{_id:0,counter:1}} ) 04. $sort:将输入文档排序后输出 如:查询男生、女生人数,按人数降序 db.stu.aggregate( {$group:{_id:'$gender',counter:{$sum:1}}}, {$sort:{counter:-1}} ) 05. $limit:限制聚合管道返回的文档数 06. $skip:跳过指定数量的文档,并返回余下的文档 如:统计男生、女生人数,按人数升序,取第二条数据 db.stu.aggregate( {$group:{_id:'$gender',counter:{$sum:1}}}, {$sort:{counter:1}}, {$skip:1}, {$limit:1} ) 注意: 聚合中的skip和limit顺序不能写反 07. $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值 1. 语法: 语法1. db.集合名称.aggregate({$unwind:'$字段名称'}) 语法2 db.集合名称.aggregate({ $unwind:{ path:'$字段名称', #拆分的字段名 preserveNullAndEmptyArrays:<boolean> #防止数据丢失 } }) 2. 解释 对于语法1,如果某条记录该字段为NULL,空数组或者没有该字段则这条记录就会丢弃不显示在结果集中 对于语法2,属性preserveNullAndEmptyArrays值为true表示保留属性值为空的文档,为false则丢弃 04. 常见表达式 $sum:计算总和,$sum:1 表示以一倍计数 $avg:计算平均值 $min:获取最小值 $max:获取最大值 $push:在结果文档中插入值到一个数组中,例如根据性别分组后,可以把当前性别这一组中的所有人的名字放到一个字段中 {$push:'$字段名'} {$push:'$$ROOT'}将文档所有内容加入到结果集中 $first:根据资源文档的排序获取第一个文档数据 $last:根据资源文档的排序获取最后一个文档数据 07. 索引 1. 创建索引 1. 创建索引 db.集合.ensureIndex({属性:1}) 参数1表示升序,-1表示降序 2. 创建多列索引 db.集合名.ensureIndex({属性1:1,属性2:1}) 查找时,只有包含第一个属性,索引才会生效 3. 创建唯一索引 db.集合名.ensureIndex({属性:1},{unique:true}) 集合中有重复数据无法创建 创建索引后仍可以插入重复数据 4.添加数据时,没有指定_id,自动创建_id,且给_id创建索引 2. 查看索引 db.集合名.getIndexes() 3. 删除索引 db.集合名.dropIndex(索引名) 08 数据备份 mongodump -h dbhost -d dbname -o dbdirectory -h:服务器地址,也可以指定端口号,在本机上备份可以不用指定该项 -d:需要备份的数据库名称 -o:备份的数据存放位置,此目录中存放着备份出来的数据 09. 数据恢复 mongorestore -h dbhost -d dbname --dir dbdirectory -h:服务器地址,在本机上备份可以不用指定该项 -d:需要恢复的数据库名 --dir:备份数据所在位置 10. 用户管理 MongoDB中创建用户,只能在某个数据库上创建用来管理这个数据库的指定角色的用户 常见角色: root: 只在 admin 数据中可使用,超级账户,超级权限 Read: 允许用户读取指定的数据库 readWrite: 允许用户读写指定的数据库 1. 创建超级用户 use admin db.createUser( { user:'admin', pwd:'123', roles:[{role:'root',db:'admin'}] } ) 2. 创建普通用户 1. 使用admin登录 2. use demo 3. db.createUser( { user:'用户名', pwd:'密码' roles:[{role:'readWrite',db:'demo'}] } ) 3. 启用安全验证 1. 修改配置文件 vi /etc/mongod.conf security: authorization: enabled 2. 重启服务 sudo service mongod restart 4. 使用用户登录 mongo -u 用户名 -p 密码 --authenticationDatabase 数据库名 5. 修改用户 1. 修改密码 db.updateUser('用户名',{pwd: '456'}) 2. 修改角色 db.updateUser('用户名',{roles:[{role: 'read',db:'demo'}]})