MongoDB基础操作

First Post:

Last Update:

安装部署

1
2
3
4
5
6
7
8
9
10
11
# MongoDB Community Server
mongod
ln -s mongod /usr/bin/mongod
mkdir -p /app/mongodb/data
mkdir -p /var/log/mongodb/
touch /var/log/mongodb/mongod.log
# MongoDB Shell
mongosh
# 设置初始密码
use admin
db.createUser({ user: 'admin', pwd: '123456Aa?', roles: [{ role: 'root', db: 'admin'}] })

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# mongod.conf

# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
dbPath: /app/mongodb/data
# journal:
# enabled: true
# engine:
# mmapv1:
# wiredTiger:

# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log

# network interfaces
net:
port: 27017
bindIp: 0.0.0.0


# how the process runs
processManagement:
timeZoneInfo: /usr/share/zoneinfo

security:
authorization: enabled

基础操作

多级查询

用点来分割,支持对象(dict)和数组(list)
例如查询组织编号

1
{"account_org.code" : "Z000000000000000001"}

查询参数等于与不等于

1
2
{"special_table.tax_liability": {"$eq": true}}
{"special_table.tax_liability": {"$ne": true}}

操作ObjectId

处理未指定id时自动生成的ObjectId

1
2
3
from bson.objectid import ObjectId

oid = ObjectId(oid_str)

角色和权限

用户角色

数据库默认角色

角色描述 角色标识
数据库用户角色 read、readWrite
数据库管理角色 dbAdmin、dbOwner、userAdmin
集群管理角色 clusterAdmin、clusterManager、clusterMonitor、hostManager
备份恢复角色 backup、restore
所有数据库角色 readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、 dbAdminAnyDatabase
超级用户角色 root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Mongo的授权采用了角色授权的方法,每个用户都有一组权限,Monog内建角色权限如下:

数据库用户角色
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
数据库管理角色
dbOwner:包含readWrite、dbAdmin、userAdmin
dbAdmin:允许用户在指定数据库中对集合、文档等操作
userAdmin:允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户
集群管理角色
clusterAdmin:只在admin数据库中可用,包含clusterManager、clusterMonitor、hostManager
clusterManager:
clusterMonitor:
hostManager
备份和恢复角色
backup
restore
所有数据库角色
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
超级用户角色
root:只在admin数据库中可用。超级账号,超级权限
内部角色
__system

创建用户

1
db.createUser({user:'user',pwd:'pwd',roles:[{role: 'dbAdmin', db:'dbname'}]})

授权用户

1
2
use admin
db.grantRolesToUser("pycloud",[{"role":"dbOwner","db":"QuestionBank"}])

取消权限

1
2
3
4
5
6
7
8
9
10
11
12
use admin
db.revokeRolesFromUser("pycloud",
[
{
role: 'readWrite',
db: 'PyCloud_Rules'
},
{
role: 'readWrite',
db: 'PyCloud_Data'
}
])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
db.grantRolesToUser("pycloud",
[
{
role: 'dbOwner',
db: 'BankReconciliation'
},
{
role: 'dbOwner',
db: 'ClosingAlert'
},
{
role: 'dbOwner',
db: 'LedgerCheck'
},
{
role: 'dbOwner',
db: 'ReportCheck'
},
{
role: 'dbOwner',
db: 'VoucherInspect'
}
])

管理命令

On mongo shell:

1
db.adminCommand({getParameter: 1, logLevel: 1})

{ “logLevel” : 0, “ok” : 1 }

On python:

1
2
3
4
5
6
7
8
9
from pymongo import MongoClient

server = 'localhost'

port = 27017

client = MongoClient(server, port)

print(client.admin.command(({'getParameter': 1, 'logLevel': 1})))

{‘logLevel’: 0, ‘ok’: 1.0}

模糊查询

1
collection.find({name:/text/})

移动集合

1
2
use admin
db.adminCommand({renameCollection:"PyCloud_Output.ReportCheck_Final_20240301",to:"ReportCheck.ReportCheck_Final_20240301"})

移动数据库

mongodb没有修改db名称的接口,执行copydb操作太耗时,所以要实现源数据库重命名为目标数据库,需要遍历源数据库下所有的集合,重命名到目标数据库下,就实现了renameDatabase的功能,使用mongodb shell直接执行js脚本

1
2
3
4
5
6
collection_list = db.getSiblingDB("PyCloud_Data").getCollectionNames();
for (let i = 0; i< collection_list.length; i++) {
let original_db_name = "PyCloud_Data" +"." + collection_list[i];
let target_db_name = "VoucherInspect"+"."+ collection_list[i];
db.adminCommand({renameCollection: original_db_name, to: target_db_name});
}