mongodb 由数据库、集合、文档三个层次组成
数据库 database
# 查看所有的数据库
show dbs
# 删除当前使用的数据库
db.dropDatabase()
# 使用某个数据库
use 数据库名
# 查看当前使用的数据库
db
db.getName()
# 查看当前数据库版本
db.version()
# 查看当前数据库状态
db.stats()
# 查看当前 db 的连接机器地址和端口
db.getMongo()
# 修复当前数据库
db.repairDatabase()
# 从一个数据库复制到另一个数据库
#fromdb:string 源数据库名称,用户必须能够对这个db进行鉴权
# todb:string 复制到目的mongod的名字,名字可以跟原名字不一样
# fromhost:string 可选项 ip+port 如果是同一mongd 复制,则忽略该项
# username:string 可选项 源主机用户名
# password: string 可选项 源主机用户名所对应的密码
# mechanism: 有 MONGODB-CR or SCRAM-SHA-1这2种 , db.isMaster().maxWireVersion 值大于等于3 那默认就是 SCRAM-SHA-1 否则默认就是MONGODB-CR(2.6版本的鉴权)
db.copyDatabase(fromdb, todb, fromhost, username, password, mechanism)
# 备份到备份目录
mongodump
# 从备份目录恢复备份语句
mongorestore
集合 collection
# 查看当前数据库下所有的集合
show collections
# 创建集合
db.createCollection('集合名称')
# name:集合的名字
# capped:是否启用集合限制,如果开启需要制定一个限制条件,默认为不启用,这个参数没有实际意义
# size:限制集合使用空间的大小,默认为没有限制
# max:集合中最大条数限制,默认为没有限制
# autoIndexId:是否使用_id作为索引,默认为使用(true或false)
# size的优先级比max要高
db.createCollection(name, {capped: <Boolean>, autoIndexId: <Boolean>, size: <number>, max <number>})
# 查看集合状态(以集合名称为 coll 为例,下同)
db.coll.stats()
# 删除集合
db.coll.drop()
文档 document
# 插入空数据并且直接创建名称为 coll 的集合
db.coll.insert({})
# 插入一个或多个数据
db.coll.insert({name: '张三', age: 22})
db.coll.insert([{name: '张三', age: 22},{name: '李四', age: 25}])
# save 方法可以用来插入新数据也可以修改相同 _id 的数据
db.coll.save({name: '王五', age: 26})
db.coll.save({'_id': ObjectId("5de1f5264d0e7ea372eddf12"), name: '王五', age: 26})
# 删除一个或所有数据
db.coll.remove({age: 22})
db.coll.remove({})
# remove 方法第二个参数为真,则只删除符合条件的数据中的第一条
db.coll.remove({age: 22}, 1)
# 更改数据
# $set 修改器 年龄修改为 22,默认只修改查到的第一条
db.coll.update({name: '张三'}, {$set: {age: 22}})
# $inc 修改器 年龄增加 10
db.coll.update({name: '张三'}, {$inc: {age: 10}})
# 如果没有查到就新增一条,将 update 的第三个参数设为 true 即可
db.coll.update({name: 'Tom'}, {$set: {age: 20}}, true)
# 批量更新,将 update 的第四个参数设为 true 即可
db.coll.update({name: '张三'}, {$set: {age: 20}}, false, true)
# 查找数据
# 查出所有数据
db.coll.find()
# 查出一条数据
db.coll.findOne()
# 控制查出数据的显示,1 表示显示,0 表示不显示
db.coll.find({}, {name: 1, '_id': 0})
# 格式化显示查出的数据
db.coll.find().pretty()
# and 查询
db.coll.find({name: '张三', age: 22})
db.coll.find({$and: [{name: '张三'}, {age: 22}]})
# or 查询
db.coll.find({$or: [{name: '张三'}, {age: 22}]})
# 大于
db.coll.find({age: {$gt: 20}})
# 小于
db.coll.find({age: {$lt: 20}})
# 等于
db.coll.find({age: 20})
# 大于等于
db.coll.find({age: {$gte: 20}})
# 小于等于
db.coll.find({age: {$lte: 20}})
# 不等于
db.coll.find({age: {$ne: 20}})
# 取余运算,查出 age % 10 为 1 的
db.coll.find({age: {$mod: [ 10 , 1 ]}})
# 属于,age 的值属于 1,2,3 中的任何一个
db.coll.find({age: {$in: [1, 2, 3]}})
# 不属于,age 的值不属于 1,2,3 中的任何一个
db.coll.find({age: {$nin: [1, 2, 3]}})
# $size,$size是查询一定元素的数量且是数组的字段
db.coll.find({key: {$size: 1}})
# $exists 存在字段,true 为存在字段 key 的数据,false 为不存在字段 key 的数据
db.coll.find({key: {$exists:true|false}})
# 正则
db.coll.find({name: /^j/, name:/e$/})
db.coll.find({name:{$regex:'runoob',$options:'$i'}})
# 内嵌对象中的值匹配
db.coll.find({'key.subkey': value})
# 取反
db.coll.find({age: {$not: {$lt: 20}}})
# $where,可以使用js
db.students.find({$where :'this.age>20'})
db.students.find({$where: function(){
return this.age > 20;
}})
# 分页查询,查出从 skip 之后的 limit 个
db.coll.find().limit(20).skip(1)
# 获取查询结果集的数量
db.coll.count('查询条件')
db.coll.find().count()
用户
身份认证:
- mongodb 是没有默认管理员账号,所以要先添加管理员账号,再开启权限认证。
- 切换到 admin 数据库,添加的账号才是管理员账号。
- 用户只能在用户所在数据库登录,包括管理员账号。
- mongodb 安装完成后,默认是没有权限验证的,默认是不需要输入用户名密码即可登录的。
- 启用访问控制前,需确保在 admin 数据库中拥有 userAdmin 或 userAdminAnyDatabase 角色的用户。
- 启用验证的方式:/etc/mongodb.conf //将 auth=true 前面的注释拿掉,然后重启服务生效。
- 启动 mongodb 前需要关闭配置文件中的 auth 选项,否则不能创建用户。
Built-In Roles(内置角色):
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
权限说明:
- Read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile
- userAdmin:允许用户向 system.users 集合写入,可以找指定数据库里创建、删除和管理用户
- clusterAdmin:只在 admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
- readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限
- dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限。
- root:只在 admin 数据库中可用。超级账号,超级权限。
# 创建用户
use admin
db.createUser({
user: '用户名',
pwd: '密码',
roles: [{
role: 'readWrite',
db: 'admin'
}]
})
# 用户认证
db.auth('用户名', '密码')
# 创建角色
db.createRole({
role: 'testRole',
privileges: [{
resource: {db: '', collection: ''},
actions: ['enableSharding']
}],
roles: ['readWriteAnyDatabase']
})
# 显示当前所有用户
show users
db.system.users.find()
# 删除用户
db.dropUser('用户名')
# 修改用户
db.updateUser(
'用户名',
{
customData: { <any information> }, // 自定义数据,用来添加一些信息,例如创建时间
roles: [
{ role: '角色', db: '数据库' } | '角色',
...
],
pwd: '密码'
},
writeConcern: { <write concern> } // 对写操作时的异常处理机制
)
# 示例
db.updateUser(
"root",{
customData:{
create_time:"2016-09-03",
update_time:"2016-09-04"
},
pwd:"123456"
}
)
# 修改用户密码
db.changeUserPassword('用户名', '密码')