世界上只有一种英雄主义,就是看清生活的真相之后依然热爱生活!

MongoDB 数据库常用操作命令

2019-07-19
126次查阅
2019/7/19

基本操作

show dbs;          # 查看数据库列表
show collections;  # 查看当前数据库中的集合(理解为MySQL中的表)
show tables;       # 同上
show users;        # 查看用户

数据库相关操作

use <dbName>;           # 进入到 <dbName> 库,不存在则创建 
db;                     # 查看当前所在库名
db.help();              # 数据库命令帮助
db.dropDatabase();      # 删除当前所在的库
db.stats();             # 当前库状态
db.repairDatabase();    # 修复当前数据库
db.getMongo();          # 查看当前db的链接机器地址

db.printCollectionStats();                      # 显示当前db所有聚集索引的状态
db.cloneDatabase("10.0.0.1");                   # 克隆 10.0.0.1 的库到本机
db.copyDatabase("db1", "db2", "127.0.0.1");     # 将本机 db1 库复制到 bd2 库中

集合操作

集合操作需先进入库中

db.<foo>.help();                        # 显示 <foo> 集合操作命令
db.<foo>.find();                        # 对于当前数据库中的 <foo> 集合进行数据查找
db.getCollection("<foo>").find({});     # 同上
db.<foo>.find({id:10});                 # 在 <foo> 集合中查找,条件是 id 等于 10
db.createCollection('user');            # 创建一个 user 集合

db.<foo>.count();          # 查询当前集合的数据条数
db.<foo>.dataSize();       # 查看数据空间大小
db.<foo>.getDB();          # 查看集合所在的库
db.<foo>.stats();          # 查看集合的状态
db.<foo>.totalSize();      # 集合总大小 
db.<foo>.storageSize();    # 集合储存空间大小
db.<foo>.drop();           # 删除集合

db.<foo>.getShardVersion();                  # Shard版本信息
db.<foo-1>.renameCollection("<foo-2>");      # 聚集集合重命名

用户相关操作

如果系统已经启动权限验证,必须使用拥有权限的账户登录操作。mongodb角色权限文档:https://docs.mongodb.com/v3.6/reference/built-in-roles/index.html

创建一个超级用户角色:

use admin;
db.createUser(
  {
    user: "admin",
    pwd: "pwd123",
    roles: [ "root" ]
  }
);

root角色为所有资源提供完全权限,相当于MySQL里的 root 账户。

在 testdb 数据库中创建一个 testuser 账户:

use testdb;
db.createUser(
  {
    user: "testuser",
    pwd: "123456",
    roles: [ { role: "dbOwner", db: "testdb" } ]
  }
);

dbOwner代表数据库所有者,可以对数据库执行任何管理操作,包含readWritedbAdminuserAdmin角色的权限。

在 admin 库中创建一个具有多个权限的账户:

user admin;
db.createUser(
  { user: "admin",
    pwd: "123456",
    roles: [ "userAdminAnyDatabase", "dbAdminAnyDatabase", "readWriteAnyDatabase"]
  }
);
show users;            # 显示当前库所有用户
db.getUser('admin');   # 查看用户详情
db.dropUser("admin");  # 删除用户
db.logout();           # 退出当前登录

# 修改用户密码
use testdb;
db.updateUser("testuser", {pwd: "123456789"});
db.changeUserPassword("testuser", "123456789");

# 修改用户角色
use testdb;
db.updateUser(
  "<username>",
  roles : [{ role: "", db: "" }]
);

用户相关操作文档:https://docs.mongodb.com/manual/reference/method/js-user-management/

连接数据库身份验证

连接后身份验证:

mongo --port 20000
use admin;
db.auth("testuser", "123456");

连接时身份验证:

mongo --port 27017 -u "root" -p "123456" --authenticationDatabase "admin"

连接时身份验证,并进入指定库:

mongo --port 20000 -u "root" -p "123456" --authenticationDatabase "admin"
mongo --port 20000 -u "testuser" -p "123456" --authenticationDatabase "admin" testdb

代码、客户端连接方式:

mongodb://testuser:123456789@192.168.0.3:20000,192.168.0.4:20000,192.168.0.5:20000/testdb
mongodb://root:pwd123@192.168.0.3:20000,192.168.0.4:20000,192.168.0.5:20000/admin

分片相关

db.runCommand({ isdbgrid : 1});      # 判断是否Shard集群

# 列出所有分片信息
use admin;
db.runCommand({ listshards : 1});

# 列出开启分片的数据库
use config;
db.databases.find({"partitioned":true});
db.databases.find();                # 列出所有数据库分片情况

# 查看分片的片键
use config;
db.collections.find();

# 删除片键
use config;
db.collections.remove({"_id":"testdb.t_user"});

# 刷新mongos的缓存
use admin;
db.adminCommand({"flushRouterConfig":1});

# 删除分片节点
db.runCommand({removeShard:"shard-2"});

# 其他
db.getPrevError();       # 查询之前的错误信息
db.resetError();         # 清除错误记录

索引

# 创建索引
db.<foo>.ensureIndex({name: 1});
db.<foo>.ensureIndex({name: 1, ts: -1});

db.<foo>.getIndexes();         # 查询当前聚集集合所有索引
db.<foo>.totalIndexSize();     # 查看总索引记录大小
db.users.reIndex();            # 读取当前集合的所有index信息
db.users.dropIndex("name_1");  # 删除指定索引
db.users.dropIndexes();        # 删除所有索引索引

增删改查 集合数据

增加

在user集合添加数据,添加的数据的数据列,没有固定,根据添加的数据为准:

db.users.save({name: 'zhangsan', age: 25, sex: true});
for(var i=1;i<=20000;i++) db.users.save({id:i, testkey:"test_val_"+i})

修改

语法:db.collection.update(criteria, objNew, upsert, multi )

  • criteria查询条件,类似 sql update查询内where后面的。
  • objNewupdate 的对象和一些更新的操作符(如$,$inc...)等,可以理解为sql update查询内set后面的。
  • upsert如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);
# 等于SQL:update users set name = 'changeName' where age = 25;

db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);
# 等于SQL:update users set age = age + 50 where name = 'Lisi';

db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);
# 等于SQL:update users set age = age + 50, name = 'hoho' where name = 'Lisi';

# 更新 users 表里面 login == lxk 修改  email 字段为后面的那个值,false 表示如果不存在就不插入新数据;true 代表查询修改所有符合条件的数据:
db.getCollection('users').update({"login" : "lxk"}, {$set: {"email": 'sk@123.com'}}, false, true);

查询

这里<foo>表示一个集合(相当于MySQL的表)。

# 查询所有记录,默认每页20条记录,输入 it 查看下一页:
db.<foo>.find();
# 等于SQL:select * from <foo>;

# 去掉集合中 name 列的重复数据
db.<foo>.distinct("name");
# 等于SQL:select distict name from <foo>;

# 查询 id = 22 的记录
db.<foo>.find({"id": 22});
# 等于SQL:select * from <foo> where id = 22;

# 查询 age > 22 的记录
db.<foo>.find({age: {$gt: 22}});
# 等于SQL:select * from <foo> where age > 22;

# 查询 age < 22 的记录
db.<foo>.find({age: {$lt: 22}});
# 等于SQL:select * from <foo> where age < 22;

# 查询 age >= 25 的记录
db.<foo>.find({age: {$gte: 25}});
# 等于SQL:select * from <foo> where age >= 25;

# 查询 age <= 25 的记录
db.<foo>.find({age: {$lte: 25}});

# 查询 age >= 23 并且 age <= 26
db.<foo>.find({age: {$gte: 23, $lte: 26}});

# 查询 name 中包含 mongo 的数据
db.<foo>.find({name: /mongo/});
# 等于SQL:select * from <foo> where name like '%mongo%';

# 查询 name 中以 mongo 开头的
db.<foo>.find({name: /^mongo/});
# 等于SQL:select * from <foo> where name like 'mongo%';

#查询指定列 name、age 数据
db.<foo>.find({}, {name: 1, age: 1});
# 等于SQL:select name, age from <foo>;
# 这里 1 可以写成 true,如果写成 false 表示排除此列

# 查询指定列 name、age 数据, age > 25
db.<foo>.find({age: {$gt: 25}}, {name: 1, age: 1});
# 等于SQL:select name, age from <foo> where age > 25;

# 按照年龄排序
db.<foo>.find().sort({age: 1});    # 升序
db.<foo>.find().sort({age: -1});   # 降序

# 查询 name = zhangsan, age = 22 的数据
db.<foo>.find({name: 'zhangsan', age: 22});
# 等于SQL:select * from <foo> where name = 'zhangsan' and age = '22';

# 查询前5条数据
db.<foo>.find().limit(5);
# 等于SQL:select top 5 * from <foo>;

# 查询10条以后的数据
db.<foo>.find().skip(10);
# 等于SQL:select * from <foo> where id not in (select top 10 * from <foo>);

# 查询在 5-10 之间的数据
db.<foo>.find().limit(10).skip(5);
# 可用于分页,limit 是 pageSize,skip 是第几页 pageSize

# or查询
db.<foo>.find({$or: [{age: 22}, {age: 25}]});
# 等于SQL:select * from <foo> where age = 22 or age = 25;

# 查询第一条数据
db.<foo>.findOne();
db.<foo>.find().limit(1);
# 等于SQL:selecttop 1 * from <foo>;

# 查询某个结果集的记录条数
db.<foo>.find({age: {$gte: 25}}).count();
# 等于SQL:select count(*) from <foo> where age >= 20;

# 如果要返回限制之后的记录数量,要使用 count(true) 或 count(非0) 
db.users.find().skip(10).limit(5).count(true);

# 按照某列进行排序
db.<foo>.find({sex: {$exists: true}}).count();
# 等于SQL:select count(sex) from <foo>;

删除

db.users.remove({age: 132});

查询修改删除:

db.users.findAndModify({
    query: {age: {$gte: 25}},
    sort: {age: -1},
    update: {$set: {name: 'a2'}, $inc: {age: 2}},
    remove: true
});

db.runCommand({ findandmodify : "users",
    query: {age: {$gte: 25}},
    sort: {age: -1},
    update: {$set: {name: 'a2'}, $inc: {age: 2}},
    remove: true
});

评论

想说点什么?