基本操作
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
代表数据库所有者,可以对数据库执行任何管理操作,包含readWrite
、dbAdmin
和userAdmin
角色的权限。
在 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
查询条件,类似 sqlupdate
查询内where
后面的。objNew
update 的对象和一些更新的操作符(如$,$inc
…)等,可以理解为sqlupdate
查询内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
});
THE END
暂无评论内容