安装
- docker方式
>>> docker pull mongo:latest
# 无数据持久化
>>> docker run -itd --name mongo --restart always -p 27017:27017 mongo --auth
# 数据持久化
>>> docker run -itd --name mongo -v mongo:/data/db --restart always -p 27017:27017 mongo --auth
# 进入客户端 admin为数据库名称
>>> docker exec -it mongodb mongo admin
db.createUser({ user:'admin',pwd:'admin',roles:[ { role:'userAdminAnyDatabase', db: 'admin'}]});
基本概念
- 对比
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
参考:https://www.runoob.com/mongodb/mongodb-databases-documents-collections.html
- 角色
Built-In Roles(内置角色):
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
backup,retore:在进行备份、恢复时可以单独指定的角色,在db.createUser()方法中roles里面的db必须写成是admin库,要不然会 报错
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限,
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
参考:https://www.crifan.com/mongodb_create_normal_gridfs_root_user_fail_error_couldnt_add_user_no_role_named_root_gridfs/
- 数据库与集合在没有数据的情况下都是不存在的,也就是说use database后,你仍然看不到database存在
> use database
switched to db database
> db
database
> show databases
- 创建对database数据库有权限的用户,需要切换回admin数据库,并用userAdminAnyDatabase权限账号验证身份,再切换至database数据库,再进行用户创建,也就是说mongodb的逻辑是用户永远都和该用户被创建时所在数据库绑定,用户的验证、创建、删除都要在该数据库下进行,否则会失败
> use admin
switched to db admin
> db.auth('admin', 'admin')
1
> use database
switched to db database
> db.createUser({user:'user', pwd:'user', roles:[{role:'readWrite', db:'database'}]})
Successfully added user: {
"user" : "user",
"roles" : [
{
"role" : "readWrite",
"db" : "database"
}
]
}
# 查看所有用户(需在admin数据库下)
> db.system.users.find().pretty()
基本操作
# 进入admin数据库shell界面
>>> docker exec -it mongodb mongo admin
# 使用admin账号进行身份认证
>>> db.auth('admin', 'admin')
1
# 创建api数据库拥有readWrite权限的账户
>>> db.createUser({ user:'user',pwd:'123456',roles:[ { role:'readWrite', db: 'api'}]});
Successfully added user: {
"user" : "user",
"roles" : [
{
"role" : "readWrite",
"db" : "api"
}
]
}
# 查看集合
>>> show collections
xxxxx
>>> show tables
xxxxx
# find一条数据
>>> db.users.findOne()
{
"_id" : ObjectId("5e85aafdd96c8fec786818fc"),
"email" : "xxxxxxxxxx@qq.com",
"password" : "pbkdf2:sha256:150000$pkN824ob$4fecb14593f491e829c2760072d652891eb759859619eb8457fa52ca13ebb006",
"active" : false
}
# find所有数据
>>> db.users.find()
{ "_id" : ObjectId("5e85aafdd96c8fec786818fc"), "email" : "xxxxxxxxx@qq.com", "password" : "pbkdf2:sha256:150000$pkN824ob$4fecb14593f491e829c2760072d652891eb759859619eb8457fa52ca13ebb006", "active" : false }
# find所有数据(格式化显示输出)
>>> db.test.find().pretty()
{
"_id" : ObjectId("5e85aafdd96c8fec786818fc"),
"email" : "xxxxxxxxxx@qq.com",
"password" : "pbkdf2:sha256:150000$pkN824ob$4fecb14593f491e829c2760072d652891eb759859619eb8457fa52ca13ebb006",
"active" : false
}
# insert一条数据
>>> db.test.insert({'test_id': 12345, 'test': '测试'})
WriteResult({ "nInserted" : 1 })
>>> db.test.findOne()
{
"_id" : ObjectId("5e8c446cf19bca7092dfbc51"),
"test_id" : 12345,
"test" : "测试"
}
# update一条数据
>>> db.test.update({'test_id': 12345}, {$set:{'test_id': 54321}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
>>> db.test.findOne()
{
"_id" : ObjectId("5e8c446cf19bca7092dfbc51"),
"test_id" : 54321,
"test" : "测试"
}
# remove一条数据
>>> db.test.remove({'test_id':54321})
WriteResult({ "nRemoved" : 1 })
MongoDB 与 RDBMS Where 语句比较
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {:} | db.col.find({“by”:“菜鸟教程”}).pretty() | where by = ‘菜鸟教程’ |
小于 | {:{$lt:}} | db.col.find({“likes”:{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {:{$lte:}} | db.col.find({“likes”:{$lte:50}}).pretty() | where likes <= 50 |
大于 | {:{$gt:}} | db.col.find({“likes”:{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {:{$gte:}} | db.col.find({“likes”:{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {:{$ne:}} | db.col.find({“likes”:{$ne:50}}).pretty() | where likes != 50 |
参考:https://www.runoob.com/mongodb/mongodb-query.html
参考:https://zhuanlan.zhihu.com/p/26215701
参考:https://www.jianshu.com/p/f5afc6488f9e