数据库连接

开启远程访问:修改配置文件 /etc/mongod.confbindIp: 127.0.0.1bindIp: 0.0.0.0
连接数据库:mongo 数据库地址:端口/数据库名 -u用户名 -p密码

数据导入导出

导入数据库文件到集合:mongoimport -d 数据库名 -c 集合名 数据库文件
导出数据库到文件:mongoexport -d 数据库名 -c 集合名 -o 文件名 --type 类型(默认json) -f 字段名(仅csv)

数据库操作

查看数据库列表:show dbs
查看当前所在数据库:dbdb.getName()
查看当前数据库状态:db.stats()
创建数据库/切换数据库:use 数据库名
删除当前数据库:db.dropDatebase()
修复当前数据库:db.repairDatabase()
查看当前数据库用户:show users

集合操作

查看当前数据库集合:db.getCollectionNames()show collections
创建集合:db.createCollection("集合名", 选项)
选项 可以是如下参数:

字段 类型 描述
capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
autoIndexId 布尔 (可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size 数值 (可选)为固定集合指定一个最大值(以字节计)。 如果 capped 为 true,也需要指定该字段。
max 数值 (可选)指定固定集合中包含文档的最大数量。

删除集合:db.集合名.drop()
统计集合数据条数:db.集合名.count()
插入数据:db.集合名.insert({"字段1":"值", "字段2":"值"})
for(var i=1; i<=100; i++) db.集合名.insert({"字段1":i,"字段2":"值"}) //循环插入100条数据
删除数据:db.集合名.remove({"字段1":"值", "字段2":"值"}) //不加参数为清空当前集合
更新数据:db.集合名.update({"字段1":"值", "字段2":"值"})db.集合名.save({"字段1":"值", "字段2":"值"})
查询数据:db.集合名.find() //所有数据
db.集合名.find({"字段1": {$gte:10,$lte:30}}) //区间10-30(小于lt,大于gt,小于等于lte,大于等于gte)
db.集合名.find({"字段1":"值", "字段2":"值"}) //指定数据
db.集合名.find({"字段1":"值", "字段2":"值"}) //指定数据
db.集合名.find().sort({"字段1":1}) //数据按字段升序排列
db.集合名.find().sort({"字段1":-1}) //数据按字段降序排列
db.集合名.find().limit(30) //指定查询数据条数
db.集合名.find().skip(2) //指定从第n条开始查询
db.集合名.find({},{"字段1":1,"字段2":1}) //指定显示字段(1为显示,0为不显示)

用户管理

修改/etc/mongod.conf文件如下开启认证:

  1. security:
  2. authorization: enabled

然后重启MongoDB服务器:service mongod restart

3.0版本以前

在mongodb3.0版本以前中,有一个admin数据库, 牵涉到服务器配置层面的操作,需要先切换到admin数据库,即 use admin , 相当于进入超级用户管理模式,mongo的用户是以数据库为单位来建立的, 每个数据库有自己的管理员.我们在设置用户时,需要先在admin数据库下建立管理员—-这个管理员登陆后,相当于超级管理员

命令:db.addUser();
简单参数: db.addUser(用户名,密码,是否只读)

注意: 添加用户后,我们再次退出并登陆,发现依然可以直接读数据库,原因是 mongodb服务器启动时, 默认不是需要认证的,要让用户生效需要启动服务器时就指定--auth选项。

# 添加用户
> use admin
> db.addUser('admin','admin',false); # 3.0版本更改为createUser();

# 删除用户
> use test
> db.removeUser(用户名); # 3.0版本更改为dropUser();

3.0版本以后

创建管理员

在3.0版本以后,mongodb默认是没有admin这个数据库的,并且创建管理员不再用addUser,而用createUser;

语法说明
{ user: "<name>",  
  pwd: "<cleartext password>",
  customData: { <any information> }, # 任意的数据,一般是用于描述用户管理员的信息
  roles: [
    { role: "<role>", db: "<database>" } | "<role>", # 如果是role就是直接指定了角色,并作用于当前的数据库
    ...
  ] # roles是必传项,但是可以指定空数组,为空就是不指定任何权限
}

Built-In Roles(内置角色):

  1. 数据库用户角色:read、readWrite;
  2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
  3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
  4. 备份恢复角色:backup、restore;
  5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  6. 超级用户角色:root
    这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
  7. 内部角色:__system
    PS:关于每个角色所拥有的操作权限可以点击上面的内置角色链接查看详情。

操作示例:

#创建数据库aaa同时创建用户aaa并作用于当前数据库
use aaa
db.createUser({"user":"aaa","pwd":"000000","roles":["readWrite"]})

官方Example

use products # mongoDB的权限设置是以库为单位的,必选要先选择库
db.createUser( 
{ "user" : "accountAdmin01", 
 "pwd": "cleartext password",
 "customData" : { employeeId: 12345 },
 "roles" : [ { role: "clusterAdmin", db: "admin" }, 
             { role: "readAnyDatabase", db: "admin" },
             "readWrite" 
             ] },
{ w: "majority" , wtimeout: 5000 } ) # readWrite 适用于products库,clusterAdmin与readAnyDatabase角色适用于admin库

writeConcern文档(官方说明

  • w选项:允许的值分别是 1、0、大于1的值、”majority”、;
  • j选项:确保mongod实例写数据到磁盘上的journal(日志),这可以确保mongd以外关闭不会丢失数据。设置true启用。
  • wtimeout:指定一个时间限制,以毫秒为单位。wtimeout只适用于w值大于1。
use shop;
db.createUser({
    user:'admin',
    pwd:'zhouzhou123',
    roles:['dbOwner']
})

注:只要新加了一个用户,admin数据库就会重新存在;

mongo --host xxx -u admin -p zhouzhou123 --authenticationDatabase shop # 用新创建的用户登录

# 查看当前用户在shop数据库的权限
use shop;
db.runCommand(
  {
    usersInfo:"shopzhouzhou",
    showPrivileges:true
  }
)

# 查看用户信息
db.runCommand({usersInfo:"userName"})

# 创建一个不受访问限制的超级用户
use admin
db.createUser(
  {
    user:"superuser",
    pwd:"pwd",
    roles:["root"]
  }
)

认证用户
> use test
> db.auth(用户名,密码); #注意是以库为单位,必须先选择库;

删除用户
# 删除用户
> use test
> db.dropUser('用户名');

修改用户密码
> use test
> db.changeUserPassword(用户名, 新密码);

# 修改密码和用户信息
db.runCommand(
  {
    updateUser:"username",
    pwd:"xxx",
    customData:{title:"xxx"}
  }
)