跳至主要內容

Mongodb 基本

Kevin 吴嘉文大约 6 分钟知识笔记数据库

安装、基本语法、资源整合

安装

官网open in new window 下载 tgz 文件

# 创建 mongodb 目录
mkdir -p /usr/local/mongodb
# 解压 mongodb 至指定目录
tar -zxvf /usr/local/src/mongodb-linux-x86_64-rhel70-4.4.1.tgz -C /usr/local/
# 重命名解压目录为 mongodb
mv /usr/local/mongodb-linux-x86_64-rhel70-4.4.1/ /usr/local/mongodb
# 创建存放数据的目录
mkdir -p /usr/local/mongodb/data/db
# 创建存放日志的目录
mkdir -p /usr/local/mongodb/logs
# 创建日志记录文件
touch /usr/local/mongodb/logs/mongodb.log

docker 安装

docker run -p 27017:27017 --restart=unless-stopped  --name mongo -v $PWD:/data/db -d mongo:4.4.14-rc0-focal --auth

更多参考 mongo docker 官方,或者 菜鸟教程open in new window

启动

# 切换至指定目录
cd /usr/local/mongodb/
# 前台启动
bin/mongod --dbpath /usr/local/mongodb/data/db/ --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0
  • --dbpath:指定数据文件存放目录
  • --logpath:指定日志文件,注意是指定文件不是目录
  • --logappend:使用追加的方式记录日志
  • --port:指定端口,默认为 27017
  • --bind_ip:绑定服务 IP,若绑定 127.0.0.1,则只能本机访问,默认为本机地址

后台启动添加 --fork 即可

bin 目录下增加一个 mongodb.conf 配置文件。

# 数据文件存放目录
dbpath = /usr/local/mongodb/data/db
# 日志文件存放目录
logpath = /usr/local/mongodb/logs/mongodb.log
# 以追加的方式记录日志
logappend = true
# 端口默认为 27017
port = 27017
# 对访问 IP 地址不做限制,默认为本机地址
bind_ip = 0.0.0.0
# 以守护进程的方式启用,即在后台运行
fork = true
auth = true

vim /etc/profile

# 添加环境变量
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGODB_HOME/bin

通过配置文件启动

mongod -f /usr/local/mongodb/bin/mongodb.conf

退出后台进程:

mongod -f /usr/local/mongodb/bin/mongodb.conf --shutdown

用户与权限管理

权限说明
read允许用户读取指定数据库。
readWrite允许用户读写指定数据库。
dbAdmin允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile。
userAdmin允许用户向 system.users 集合写入,可以在指定数据库里创建、删除和管理用户。
clusterAdmin必须在 admin 数据库中定义,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase必须在 admin 数据库中定义,赋予用户所有数据库的读权限。
readWriteAnyDatabase必须在 admin 数据库中定义,赋予用户所有数据库的读写权限。
userAdminAnyDatabase必须在 admin 数据库中定义,赋予用户所有数据库的 userAdmin 权限。
dbAdminAnyDatabase必须在 admin 数据库中定义,赋予用户所有数据库的 dbAdmin 权限。
root必须在 admin 数据库中定义,超级账号,超级权限。

创建管理权限

use admin 切换至 admin 数据库进行登;show user 查看用户。创建用户:

db.createUser({ 
    user: "kevin",
    pwd: "777777",
    roles: [
        { role: "userAdminAnyDatabase", db: "admin" } 
    ]
});

链接 mongo 服务后,登录use admindb.auth("kevin","777777") 进行验证,返回 1 为验证成功。

创建普通用户

普通用户针对非 admin 数据库。首先需要使用 use test 创建数据库。

db.createUser({ 
    user: "user1",
    pwd: "111111",
    roles: [
        { role: "readWrite", db: "test" } 
    ]
});

同样登录使用 use testdb.auth("user1","111111")

更新用户

需要当前用户具有 userAdminuserAdminAnyDatabseroot 角色。

更新权限

db.updateUser("用户名", {"roles":[{"role":"角色名称",db:"数据库"},{"更新项 2":"更新内容"}]})

更新密码 - 需要切换到该用户所在的数据库。

db.updateUser("用户名", {"pwd":"新密码"})
db.changeUserPassword("用户名", "新密码")

删除用户 - 需要切换到该用户所在的数据库

db.dropUser("user name")

备份

参考open in new window

以下进讨论由用户密码情况,在服务器 A 上备份 mongodb

./mongodump --db=testdb --authenticationDatabase=admin --username=admin --password=123456 --host=127.0.0.1:27017 --out=./backups/mongofile

其中: db 为需要备份的数据库名, authenticationDatabase 为认证用的数据库名,username 为认证的用户名, password 为认证用的数据库用户密码, host 为连接的 IP 及端口, out 为备份后的存储目录

在 B 机上导入,首先创建对应的 mongo 用户

mongo admin
db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});

而后将需要导入的文件 ./backups/mongofile 发送到 B 服务器上,而后进行回复:

mongorestore --db=testdb --authenticationDatabase=admin --username=admin --password=123456 --host=127.0.0.1:27017 ./backups/mongo/testdb

GUI

Robo 3t 下载解压后可通过 bin/robo3t 文件直接运行。

连接到 mongo 服务器时候需配置Authentication 4.0 以上版本选择 SHA-S56

语法

数据库

切换/创建 数据库 use test ,显示数据库 show dbs,不同用户显示不一样;删除数据库需要切换到当前库,然后 db.dropDatabase()

# 执行以下函数(2 选 1)即可关闭服务
db.shutdownServer()
db.runCommand(“shutdown”)

集合 collection

使用 db.createCollection(name, option) 直接创建; 使用 show tables 查看集合;使用 db.collection_name.drop() 删除。

文档

插入

使用 db.new_c.insert() 可直接创建 new_c 集合并且插入一个文档。如:

user1 = {
"_id":102,
"students":[{
"id":1,"name":"zhangsan"
},{"id":2,"name":3}]
}

db.new_c.insert(user1)

_id 为文档唯一值,会更新原本已有的 _id 数据。批量插入的时候采用 db.new_c.insert([doc1,doc2...])

更新

db.collection_name.update(query, update, option)
  • query : update 的查询条件,类似 sql update 查询内 where 后面的。
  • update : update 的对象和一些更新的操作符(如$,$inc...)等,也可以理解为 sql update 查询内 set 后面的
  • upsert : 可选,这个参数的意思是,如果不存在 update 的记录,是否插入 objNew,true 为插入,默认是 false,不插入。
  • multi : 可选,mongodb 默认是 false,只更新找到的第一条记录,如果这个参数为 true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。
db.new_c.update({'name':'zhangsan'},{$set:{'name':'MongoDB'}},false,true)

如上例,$set 更新会覆盖原有数据,而非只更新 name

删除

df.new_c.remove({"name":"zhangsang"}, {justOne: true})

查询

db.user.find("_id":{"$lte":4,"gle":3})
db.user.distinct("name") # 根据 name 去重

正则定义在 / / 内。

更多查询案例与语法open in new window

排序

db.COLLECTION_NAME.find().sort({KEY:1})

聚合

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
   "result" : [
      {
         "_id" : "runoob.com",
         "num_tutorial" : 2
      },
      {
         "_id" : "Neo4j",
         "num_tutorial" : 1
      }
   ],
   "ok" : 1
}

可以接 $sum,$max,$first等。

索引

索引通常能够极大的提高查询的效率。db.collection.createIndex(keys, options)

可以使用部分字段创建索引。

db.col.createIndex({"title":1,"description":-1})

1、查看集合索引

db.col.getIndexes()

2、查看集合索引大小

db.col.totalIndexSize()

3、删除集合所有索引

db.col.dropIndexes()

4、删除集合指定索引

db.col.dropIndex("索引名称")

PyMongo

官方文档open in new window

myclient = pymongo.MongoClient(username=user,                password=password,                 authMechanism='SCRAM-SHA-256')
dblist = myclient.list_database_names() 
mydb = myclient["db1"]  # 创建/链接 db1 的数据库
collist = mydb. list_collection_names()
mycol = mydb["sites"]  # 创建集合 collection

文档处理

插入

x = mycol.insert_one(mydict)  # x.inserted_id
mycol.insert_many(mylist)  # 插入多个文档

查找

myquery = { "name": { "$regex": "^R" } }
for x in mycol.find(myquery):  
  print(x)
上次编辑于:
贡献者: kevinng77