数据库相关
- 查看数据库
use database_name
- 查看所有数据库
show dbs
- 查看当前使用的数据库
db
- 删除数据库
db.dropDatabase()
集合相关
- 查看集合帮助
db.collection_Name.help();
- 查看数据库所有集合
show collections
- 创建集合
db.createCollection(collection_Name)
- 创建集合并插入文档
db.collection_Name.insert(document)
- 删除集合
db.runCommand({drop:'collection_Name'});
- 创建固定大小集合
db.createCollection('logs',{size:50,max:5,capped:true});
- 非固定集合转固定集合
db.runCommand({convertToCapped:"logs",size:5});
文档相关
插入文档
- insert插入 (如果指定_id字段,并且数据库中有同样值的_id则插入失败)
db.collection_name.insert(document);
- save插入 (跟上面区别就是会覆盖_id相同的数据)
db.collection_name.save(document)
更新文档
db.collection.update(
<query>,
<updateObj>,
{
upsert: <boolean>,
multi: <boolean>
}
)
- query 查询条件,指定要更新符合哪些条件的文档
update 更新后的对象或指定一些更新的操作符
$set直接指定更新后的值
$inc在原基础上累加
upsert 可选,这个参数的意思是,如果不存在符合条件的记录时是否插入updateObj. 默认是false,不插入。
multi 可选,mongodb 默认只更新找到的第一条记录,如果这个参数为true,就更新所有符合条件的记录。 - 例子:
db.collection_Name.update({name:'xxx'},{$set:{yyy:10}},{multi:true});
更新操作符
- $set 直接指定更新后的值
db.collection_Name.update({name:'xxx'},{$set:{yyy:10}},{multi:true});
- $inc 原基础上累加
db.collection_Name.update({name:'xxx'},{$inc:{yyy:10}},{multi:true});
- $unset 删除指定键
db.collection_Name.update({name:'xxx'},{$unset:{yyy:10}},{multi:true});
- $push 向数组中添加元素
db.collection_Name.update({name:'xxx'},{
$push:{"hobbies":"smoking"}
});
- $ne 表示not in 一般是查询条件
db.collection_Name.update({name:'xxx',hobbies:{$ne:'smoking'}},{$push:{"hobbies":"smoking"}});
- $addToSet 向集合中添加元素
db.collection_Name.update({name:'xxx'},{$addToSet:{"hobbies":"smoking"}});
- $each 把数组元素逐个添加到集合中
var hobbies = ["A",'B'];
db.collection_Name.update({name:'xxx'},{$addToSet:{hobbies:{$each:hobbies}}});
- $pop 从数组中移除指定索引的元素
db.collection_Name.update({name:'xxx'},{$pop:{hobbies:1}});
- 修改指定索引元素
db.collection_Name.update({name:'xxx'},{$set:{"hobbies.0":"smoking"}});
删除文档
- remove 移除集合中数据
db.collection.remove(
<query>,
{
justOne: <boolean>
}
)
- 参数:
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除匹配到的多个文档中的第一个
db.collection_Name.remove({name:"xxx"},{justOne:true})
查询文档
- find 通用查询
db.collection_name.find()
- find查询指定列
db.collection_name.find({queryWhere},{key:1})
- 参数:
collection_name 集合的名字
queryWhere 参阅查询条件操作符
key 指定要返回的列
1 表示要显示 - 例子:
db.collection_Name.find({},{age:1});
- findOne 查询匹配结果第一条
db.collection_name.findOne()
- $in 查询字段在某范围内
db.collection_name.find({age:{$in:[30,100]}},{name:1,age:1});
- $nin 查询字段不在某范围
db.collection_name.find({age:{$nin:[30,100]}},{name:1,age:1});
- $not 对特定条件取反
db.collection_name.find({age:{$not:{$gte:20,$lte:30}}});
- where 条件过滤
db.collection_name.find({$where:"this.age>30"},{name:1,age:1});
- distinct 查找集合里同字段不重复的值
db.runCommand({distinct:'collection_name',key:'key'}).values;
数组查询
db.collection_Name.find({friends:[ "A", "B", "C", "D" ]});
- 查询包含A即可
db.collection_Name.find({friends:"A"});
- $all 必须同时包含AB
db.collection_Name.find({friends:{$all:['A','B']}});
- $in 或者关系 A或B
db.collection_Name.find({friends:{$in:['A','B']}});
- $size 按数组长度查询
db.collection_Name.find({friends:{$size:4}});
- $slice 返回数组中一部分,startIndex可以省略,默认0开始
db.collection_Name.find({},{friends:{$slice:[0,3]}});
"friends" : [ "A", "B", "C" ]
条件操作符
- $gt 大于
db.collectoin_name.find({<key>:{$gt:<value>}})
- $gte 大于等于
db.collectoin_name.find({<key>:{$gte:<value>}})
- $lt 小于
db.collectoin_name.find( {<key>:{$lt:<value>}})
- $lte 小于等于
db.collectoin_name.find({<key>:{$lte:<value>}})
- 同时使用大于小于
db.collectoin_name.find({<key>:{$gte:<value>},<key>:{$lte:<value>}})
- $or 或者
db.collection_name.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
)
- and于or连用:
db.collection_name.find(
{
key1:value1,
key2:value2,
$or: [
{key1: value1},
{key2:value2}
]
}
)
- 查询_id
db.collectoin_name.find({"_id" : ObjectId("value")})
- 查询条数
db.collectoin_name.find().count()
- 正则匹配
db.collection.find({key:/value/})
分页查询
- limit 读取指定数量数据
db.collectoin_name.find().limit(number)
- skip 跳过指定数量数据
db.collectoin_name.find().skip(number)
- skip与limit连用
db.collectoin_name.find().skip(skipNum).limit(limitNum)
- sort 排序 1为正序,-1为倒序
db.collectoin_name.find().sort({key:1})
db.collectoin_name.find().sort({key:-1})
索引
- 创建匿名索引
db.collection_Name.ensureIndex({key:1});
- 创建命名索引
db.collection_Name.ensureIndex({key:1},{name:'keyIndex'});
db.collection_Name.getIndexes()//查看索引
- explain 查询速度
db.collection_Name.find({key:'findcondition'}).explain();
- 指定使用的索引
db.collection_Name.find({key:'findcondition'}).hint("keyIndex").explain(true);
- 删除索引
db.collection_Name.dropIndex('keyIndex');//删除指定的索引
db.collection_Name.dropIndex('*');
db.runCommand({dropIndexes:"collection_Name",index:"keyIndex"});//删除所有的索引
- 在后台创建索引
db.collection_Name.ensureIndex({key:1},{name:'keyIndex',unique:true,background:true});
- 复合索引
db.collection_Name.ensureIndex({key1:1,key2:1});
- 过期索引
1.索引字段的值必须Date对象,不能是其它类型比如时间戳
2.删除时间不精确,每60秒跑一次。删除也要时间,所以有误差。
db.collection_Name.insert({time:new Date()});
db.collection_Name.ensureIndex({time:1},{expireAfterSeconds:10});
- 全文索引
$text:表示要在全文索引中查东西
$search:后边跟查找的内容, 默认全部匹配
db.article.find({$text:{$search:'boy'}});
db.article.find({$text:{$search:'girl'}});
db.article.find({$text:{$search:'boy girl'}});//多次查找,多个关键字为或的关系
db.article.find({$text:{$search:"a b"}});
db.article.find({$text:{$search:"boy -girl"}}); // -表示取消
db.article.find({$text:{$search:"a \"coco cola\" b "}}); //支持转义符的,用\斜杠来转义
备份恢复
- 锁定数据库
db.runCommand({fsync:1,lock:1});
- 解锁数据库
db.fsyncUnlock();
- 备份
mongodump
-- host 127.0.0.1
-- port 27017
-- out D:/databack/backup
-- collection mycollection
-- db test
-- username
-- password
- 恢复
mongorestore
--host
--port
--username
--password
path
权限
角色
- 数据库用户角色:
read :提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespaces
readWrite: 包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限 - 数据库管理角色:
dbOwner:该数据库的所有者,具有该数据库的全部权限。
dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。
userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。 - 集群管理角色:
admin数据库包含了下面的角色,用户管理整个系统,而非单个数据库。这些权限包含了复制集和共享集群的管理函数。
clusterAdmin:提供了最大的集群管理功能。相当于clusterManager, clusterMonitor, and hostManager和dropDatabase的权限组合。
clusterManager:提供了集群和复制集管理和监控操作。拥有该权限的用户可以操作config和local数据库(即分片和复制功能)
clusterMonitor:仅仅监控集群和复制集。
hostManager:提供了监控和管理服务器的权限,包括shutdown节点,logrotate, repairDatabase等。 备份恢复权限:admin数据库中包含了备份恢复数据的角色。包括backup、restore等等。 - 所有数据库角色:
admin数据库提供了一个mongod实例中所有数据库的权限角色:
readAnyDatabase:具有read每一个数据库权限。但是不包括应用到集群中的数据库。
readWriteAnyDatabase:具有readWrite每一个数据库权限。但是不包括应用到集群中的数据库。
userAdminAnyDatabase:具有userAdmin每一个数据库权限,但是不包括应用到集群中的数据库。
dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限,但是不包括应用到集群中的数据库。 - 超级管理员权限
root: dbadmin到admin数据库、useradmin到admin数据库以及UserAdminAnyDatabase。但它不具有备份恢复、直接操作system.*集合的权限,但是拥有root权限的超级用户可以自己给自己赋予这些权限。 - 备份恢复角色
backup、restore - 内部角色
__system:集群中对任何数据库采取任何操作
插入用户
//use admin进入admin库,往里面插入用户
db.system.user.insert({
user:'xxx',
pwd:'123',
roles:[
{
role:'readWrite',
db:'dbName'
}
]
})
//或者调用createUser方法
db.createUser(
{
user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
],
authenticationRestrictions: [
{
clientSource: ["<IP>" | "<CIDR range>", ...]
serverAddress: ["<IP>" | "<CIDR range>", ...]
},
...
]
}
)
- 参数:
user 用户名
roles 一个用户的角色数组
pwd 可选,账号密码,该字段可以是散列值或字符串,不过存储是按照散列值的方式存储的
customData 可选 ,可以为任意信息。此字段可用于存储管理员希望与此特定用户关联的任何数据。例如,这可能是用户的全名或雇员id
authenticationRestrictions 可选的。该字段为3.6版本以后的新特性,服务器在创建用户上强制执行的身份验证限制。指定可连接服务器的访问用户的ip地址列表或指定可连接服务器的服务器ip地址列表。(即白名单验证)
权限登录
mongod --auth //或者在配置文件中配置auth=true
mongo -u username -p password 127.0.0.1:27017/dbName //客户端登录方式或者切换到数据库后使用下面鉴权
鉴权
use dbName
db.auth('username',password)
查看权限
db.runCommand({usersInfo:'username',showPrivileges:true});
修改密码
db.changeUserPassword(username, password)
增加角色
db.grantRolesToUser( "userName" , [ { role: "<role>", db: "<database>" } ])
移除角色
db.revokeRolesFromUser( "userName" , [ { role: "<role>", db: "<database>" } ])
更新角色
该方法必须运行在角色的数据库上。该方法会完全覆盖原来的角色配置。
db.updateRole(rolename, update, writeConcern)
删除用户
删除某个数据库的用户,需要先切换到该数据库,否则删除不成功。
db.dropUser(username)