【MongoDB】Ubuntu22.04 下安装 MongoDB | 用户权限认证 | skynet.db.mongo 模块使用

news2024/9/21 8:03:04

文章目录

    • Ubuntu 22.04 安装 MongoDB
      • 后台启动 MongoDB
      • shell 连入 MongoDB 服务
    • MongoDB 用户权限认证
      • 创建 root 用户
      • 开启认证
      • 重启 MongoDB 服务
      • 创建其他用户
      • 查看用户信息
      • 验证用户权限
      • 删除用户
    • skynet.db.mongo 模块使用
      • auth
      • ensureIndex
      • find、findOne
      • insert、safe_insert
      • delete、safe_delete
      • update、safe_update
      • aggregate
      • safe_batch_insert、safe_batch_delete

Ubuntu 22.04 安装 MongoDB

其他平台安装教程可参考官网:https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-ubuntu/


  1. 确定主机运行哪个 Ubuntu 版本:(配置一致的继续往下看)
cat /etc/lsb-release

在这里插入图片描述

  1. 安装 mongodb 社区版的相关依赖
sudo apt-get install libcurl4 libgssapi-krb5-2 libldap-2.5-0 libwrap0 libsasl2-2 libsasl2-modules libsasl2-modules-gssapi-mit openssl liblzma5 gnupg curl
  1. 导入 MongoDB 公共 GPG 密钥
curl -fsSL https://pgp.mongodb.com/server-7.0.asc | \
   sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg \
   --dearmor
  1. 创建/etc/apt/sources.list.d/mongodb-org-7.0.list 列表文件
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
  1. 重新加载本地包数据库
sudo apt-get update
  1. 安装最新的稳定版本
sudo apt-get install -y mongodb-org

后台启动 MongoDB

  • 配置 /etc/mongod.conf

    • bindIp: 0.0.0.0
    • fork: true
# mongod.conf

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

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
#  engine:
#  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:
  fork: true
  timeZoneInfo: /usr/share/zoneinfo

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:
  • sudo mongod -f /etc/mongod.conf

执行后结果如下:

about to fork child process, waiting until server is ready for connections.
forked process: 361
child process started successfully, parent exiting
  • ps -ef | grep mongod:可以看到有mongod进程在后台运行

在这里插入图片描述


shell 连入 MongoDB 服务

  • mongosh:mongodb 客户端连接工具(安装时自带)

在这里插入图片描述

成功连入使用:

在这里插入图片描述


MongoDB 用户权限认证

创建 root 用户

在 MongoDB 中,root 账号是具有最高权限的账号,可以执行所有操作。

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

开启认证

我们需要开启 MongoDB 的认证功能,以确保只有经过认证的用户才能访问数据库。

  • /etc/mongod.conf

在启动配置文件中,添加以下配置:

security:
  authorization: enabled

重启 MongoDB 服务,认证功能才会生效。

重启 MongoDB 服务

官方描述:Sending a KILL signal kill -9 will probably cause damage as mongod will not be able to cleanly exit. (In such a scenario, run the repairDatabase command.)

可以采用在 mongosh 连入数据库后,执行下述指令来友好关闭服务进程。

use admin
db.shutdownServer()

创建其他用户

在MongoDB中,每个数据库都有自己的权限系统,可以为每个数据库创建不同的账号并赋予不同的角色。

db.createUser({user: 'cauchy', pwd: 'root', roles: [{ role: 'readWrite', db: 'test'}]})

readWrite: https://www.mongodb.com/docs/manual/reference/built-in-roles/#mongodb-authrole-readWrite

roles 可参考:https://www.mongodb.com/docs/manual/reference/built-in-roles/

查看用户信息

执行下述指令,查看当前数据库系统中的所有用户信息:

use admin
db.system.users.find()

在这里插入图片描述

验证用户权限

在 test 数据库中,验证当前 cauchy 用户权限

use test
db.auth('cauchy', 'root')

删除用户

use test
db.dropUser('cauchy')

skynet.db.mongo 模块使用

本节主要讲解在 Skynet 框架中一些常用的 API,以及如何使用相应的 API 来执行 MongoDB 的 CRUD。

前置变量、方法:

host = "127.0.0.1"
port = 27017
username = "cauchy"
password = "root"
authdb = "test"
db_name = "test"

function create_client()
	return mongo.client({
		host = host, 
		port = port,
		username = username,
		password = password, 
		authdb = authdb
	})
end 

auth

数据库连接认证

  • 用法:db:auth(user, pwd)

测试代码:

function test_auth()
	local ok, err, ret
	local c = mongo.client({
			host = host, 
			port = port,
		}
	)
	local db = c[db_name]
	db:auth(username, password)

	db.testcol:dropIndex("*")
	db.testcol:drop()

	ok, err, ret = db.testcol:safe_insert({test_key = 1});
	assert(ok and ret and ret.n == 1, err)
end 

如果注释掉认证:-- db:auth(username, password),则会报错提示需要权限认证。

在这里插入图片描述


ensureIndex

创建索引

  • 用法:db.collection:ensureIndex({ key1 }, { option })

源码 mongo.lua 中,这个 API 实际上就是创建索引:

mongo_collection.ensureIndex = mongo_collection.createIndex

测试代码:

function test_insert_with_index()
	local ok, err, ret
	local c = create_client()
	local db = c[db_name]

	db.testcol:dropIndex("*")
	db.testcol:drop()

	db.testcol:ensureIndex({test_key = 1}, {unique = true, name = "test_key_index"})
	--[[ mongosh
		db.testcol.getIndexes()
	]]

	ok, err, ret = db.testcol:safe_insert({test_key = 1})
	assert(ok and ret and ret.n == 1, err)

	ok, err, ret = db.testcol:safe_insert({test_key = 1})
	assert(ok == false and string.find(err, "duplicate key error"))
end

执行结果:
在这里插入图片描述


find、findOne

查找符合条件的文档,find 查找所有,findOne 查找第一条

  • 用法:db.collection:find(query, projection)db.collection:findOne(query, projection)
  • projection:查询结果的投影

源码:(nextfindfindOne

local mongo_cursor = {}
local cursor_meta =	{
	__index	= mongo_cursor,
}
------------------------------------------------------------------------------------------------------
function mongo_cursor:next()
	if self.__ptr == nil then
		error "Call	hasNext	first"
	end
	local r	= self.__document[self.__ptr]
	self.__ptr = self.__ptr	+ 1
	if self.__ptr >	#self.__document then
		self.__ptr = nil
	end

	return r
end
------------------------------------------------------------------------------------------------------
function mongo_collection:findOne(query, projection)
	local cursor = self:find(query, projection)
	if cursor:hasNext() then
		return cursor:next()
	end
	return nil
end
------------------------------------------------------------------------------------------------------
function mongo_collection:find(query, projection)
	return setmetatable( {
		__collection = self,
		__query	= query	and	bson_encode(query) or empty_bson,
		__projection = projection and bson_encode(projection) or empty_bson,
		__ptr =	nil,
		__data = nil,
		__cursor = nil,
		__document = {},
		__flags	= 0,
		__skip = 0,
		__limit = 0,
		__sort = empty_bson,
	} ,	cursor_meta)
end
  1. 简单查看上述源码,可以发现 cursor:next 返回 __document 中的内容,即为实际找到的文档内容。

  2. find 返回一张表,表中有很多字段(__collection__cursor__document 等),这张表的元表是 cursor_meta,而 cursor_meta 的属性 __index 是表 mongo_cursor。所以在用 find 查找符合条件的文档时,返回的值应该使用 next 方法去一个个遍历获取所有的返回结果,即为 __document 中的内容。

  3. findOne 直接就是返回查找到的第一个文档,如上述 return cursor:next()


insert、safe_insert

插入一条文档

  • 用法:db.collection:insert(doc)db.collection:safe_insert(doc)

源码:

function mongo_collection:insert(doc)
	if doc._id == nil then
		doc._id	= bson.objectid()
	end
	self.database:send_command("insert", self.name, "documents", {bson_encode(doc)})
end
------------------------------------------------------------------------------------------------------
function mongo_collection:safe_insert(doc)
	local r = self.database:runCommand("insert", self.name, "documents", {bson_encode(doc)})
	return werror(r)
end

如上述源码,safe_insert 会返回一些相关信息(由 werror 返回),而 insert 没有任何返回值。


delete、safe_delete

删除符合条件的一条或多条文档

  • 用法:db.collection:delete(query, single)db.collection:safe_delete(query, single)
  • single:删除条数(即limit限制)

源码:

function mongo_collection:delete(query, single)
	self.database:runCommand("delete", self.name, "deletes", {bson_encode({
		q = query,
		limit = single and 1 or 0,
	})})
end
------------------------------------------------------------------------------------------------------
function mongo_collection:safe_delete(query, single)
	local r = self.database:runCommand("delete", self.name, "deletes", {bson_encode({
		q = query,
		limit = single and 1 or 0,
	})})
	return werror(r)
end

如上述源码,safe_delete 会返回一些相关信息(由 werror 返回),而 delete 没有任何返回值。

测试代码:

function test_find_and_remove()
	local ok, err, ret
	local c = create_client()
	local db = c[db_name]

	db.testcol:dropIndex("*")
	db.testcol:drop()

	local cursor = db.testcol:find()
	assert(cursor:hasNext() == false)

	db.testcol:ensureIndex({test_key = 1}, {test_key2 = -1}, {unique = true, name = "test_index"})

	ok, err, ret = db.testcol:safe_insert({test_key = 1, test_key2 = 1})
	assert(ok and ret and ret.n == 1, err)

	cursor = db.testcol:find()
	assert(cursor:hasNext() == true)
	local v = cursor:next()
	assert(v)
	assert(v.test_key == 1)

	ok, err, ret = db.testcol:safe_insert({test_key = 1, test_key2 = 2})
	assert(ok and ret and ret.n == 1, err)

	ok, err, ret = db.testcol:safe_insert({test_key = 2, test_key2 = 3})
	assert(ok and ret and ret.n == 1, err)

	ret = db.testcol:findOne({test_key2 = 1})
	assert(ret and ret.test_key2 == 1, err)

	ret = db.testcol:find({test_key2 = {['$gt'] = 0}}):sort({test_key = 1}, {test_key2 = -1}):skip(1):limit(1)
	--[[ mongosh
		db.testcol.find({test_key2: {$gt: 0}}).sort({test_key: 1}, {test_key2: -1}).skip(1).limit(1)
	]]
	assert(ret:count() == 3)
	assert(ret:count(true) == 1)
	if ret:hasNext() then
		ret = ret:next()
	end
	assert(ret and ret.test_key2 == 1)

	db.testcol:delete({test_key = 1})
	db.testcol:delete({test_key = 2})

	ret = db.testcol:findOne({test_key = 1})
	assert(ret == nil)
end

上述代码中有调用了sortskiplimit,如源码所示,即为 find 返回的表中,__sort__skip__limit字段附上了值,而不是直接对数据执行排序,跳转、约束等操作。

  • count 比较特殊,会实际执行一次指令 runCommand,需要参数 with_limit_and_skip。如果参数为 nilfalse,则执行会忽略 skiplimit,反之,会加上。

源码(sortskiplimitcount ):

-- cursor:sort { key = 1 } or cursor:sort( {key1 = 1}, {key2 = -1})
function mongo_cursor:sort(key, key_v, ...)
	if key_v then
		local key_list = unfold({}, key, key_v , ...)
		key = bson_encode_order(table.unpack(key_list))
	end
	self.__sort = key
	return self
end

function mongo_cursor:skip(amount)
	self.__skip = amount
	return self
end

function mongo_cursor:limit(amount)
	self.__limit = amount
	return self
end

function mongo_cursor:count(with_limit_and_skip)
	local cmd = {
		'count', self.__collection.name,
		'query', self.__query,
	}
	if with_limit_and_skip then
		local len = #cmd
		cmd[len+1] = 'limit'
		cmd[len+2] = self.__limit
		cmd[len+3] = 'skip'
		cmd[len+4] = self.__skip
	end
	local ret = self.__collection.database:runCommand(table.unpack(cmd))
	assert(ret and ret.ok == 1)
	return ret.n
end

update、safe_update

更新一条文档

  • 用法:db.collection:update(query,update,upsert,multi)db.collection:safe_update(query,update,upsert,multi)
  • upsert : 默认是false。如果不存在 query 对应条件的文档,是 true 则插入一条新文档,false 则不插入。
  • multi : 默认是 false,只更新找到的第一条记录。是 true,就把按条件查出来多条记录全部更新。

示例代码:

function test_update()
	local ok, err, r
	local c = create_client()
	local db = c[db_name]
	db.testcol:dropIndex("*")
	db.testcol:drop()

	db.testcol:safe_insert({test_key = 1, test_key2 = 1})
	db.testcol:safe_insert({test_key = 1, test_key2 = 2})

	-- ok, err, r = db.testcol:safe_update({test_key2 = 2}, { ['$set'] = {test_key = 2} }, true, false)
	-- assert(ok and r and r.n == 1)
	ok, err, r = db.testcol:safe_update({test_key = 1}, { ['$set'] = {test_key2 = 3} }, true, true)
	assert(ok and r and r.n == 2)
end 

aggregate

聚合,将来自多个 doc 的 value 组合在一起,并通过对分组数据进行各种操作处理,返回计算后的数据结果,主要用于处理数据(例如统计平均值,求和等)。

  • 用法:db.collection:aggregate({ { ["$project"] = {tags = 1} } }, {cursor={}})
  • @param pipeline: array
  • @param options: map

测试代码:

function test_runcommand()
	local ok, err, ret
	local c = create_client()
	local db = c[db_name]

	db.testcol:dropIndex("*")
	db.testcol:drop()

	ok, err, ret = db.testcol:safe_insert({test_key = 1, test_key2 = 1})
	assert(ok and ret and ret.n == 1, err)

	ok, err, ret = db.testcol:safe_insert({test_key = 1, test_key2 = 2})
	assert(ok and ret and ret.n == 1, err)

	ok, err, ret = db.testcol:safe_insert({test_key = 2, test_key2 = 3})
	assert(ok and ret and ret.n == 1, err)

	local pipeline = {
		{
			["$group"] = {
				_id = mongo.null,
				test_key_total = { ["$sum"] = "$test_key"},
				test_key2_total = { ["$sum"] = "$test_key2" },
			}
		}
	}
	ret = db:runCommand("aggregate", "testcol", "pipeline", pipeline, "cursor", {})
	assert(ret and ret.cursor.firstBatch[1].test_key_total == 4)
	assert(ret and ret.cursor.firstBatch[1].test_key2_total == 6)
	
	local res = db.testcol:aggregate(pipeline, {cursor={}})
	assert(res and res.cursor.firstBatch[1].test_key_total == 4)
	assert(res and res.cursor.firstBatch[1].test_key2_total == 6)
end

官方的 aggregate 接口手册:https://www.mongodb.com/docs/manual/reference/command/aggregate/


safe_batch_insert、safe_batch_delete

批量插入和删除

  • 用法:db.collection:safe_batch_insert(docs)db.collection:safe_batch_delete(docs)

测试代码:

function test_batch_insert_delete()
	local ok, err, ret
	local c = create_client()
	local db = c[db_name]

	db.testcol:dropIndex("*")
	db.testcol:drop()

	local insert_docs = {}
	local insert_length = 10
	for i = 1, insert_length do 
		table.insert(insert_docs, {test_key = i})
	end 
	db.testcol:safe_batch_insert(insert_docs)
	ret = db.testcol:find()
	assert(insert_length == ret:count(), "test safe batch insert failed")

	local delete_docs = {}
	local delete_length = 5
	for i = 1, delete_length do 
		table.insert(delete_docs, {test_key = i})
	end 
	db.testcol:safe_batch_delete(delete_docs)

	assert(ret:count() == insert_length - delete_length, "test safe batch delete failed")
end 

更多的 skynet.db.mongo 模块用法可以去源码阅读查看。

附上 MongoDB 7.0 Manual

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/988324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于灾备系统中滚动备份是什么?

备份可以为数据提供安全性和某种形式的“撤销”功能,减少甚至消除不稳定性和风险。最常见的备份类型是完全备份和增量备份。但是,如果您需要频繁的、实时的备份,那么滚动备份就是一种更好的方法。 滚动备份: 在可接受的时间间隔…

ArcGIS 10.8软件安装包下载及安装教程

【软件名称】:ArcGIS 10.6 【安装环境】:Windows 【下载链接 】: 链接:https://pan.baidu.com/s/1wKpTeiFdhMBmbRWrJRCsoA 提取码:0987 复制这段内容后打开百度网盘手机App,操作更方便哦 软件简介 ArcGIS D…

手术麻醉管理系统源码的开发及应用

手术麻醉管理系统针对麻醉科、手术室和外科病房开发,用于管理与手术麻醉相关的信息,实现有关数据的自动采集、报告的自动生成以及病历的电子化,是医院信息系统的一个重要组成部分。采集和管理的数据包含患者的手术信息、麻醉信息,…

大数据和数据要素有什么关系?

大数据与数据要素之间存在密切的关系。大数据是指海量、多样化、高速生成的数据,而数据要素是指构成数据的基本元素或属性。数据要素包括但不限于数据的类型、结构、格式、单位、精度等。 大数据的产生和应用离不开数据要素的支持。数据要素确定了数据的基本特征和…

14. 线性代数 - 线性方程组

文章目录 线性方程组矩阵行列式全排列和逆序数N阶行列式(非)齐次线性方程Hi,大家好。我是茶桁。 结束了「微积分」部分的学习之后我们稍作休整,今天正式开始另外一部分:「线性代数」的学习。小伙伴们放松完回来要开始紧张起来了。 我们之前说过,不管是哪一个工程学科,根…

一定要看!超好用的音频剪辑软件推荐

“有没有好用的音频剪辑软件推荐呀?最近需要剪辑一个混合音乐,用来参加学校的歌曲比赛,但是现在没有办法进行剪辑,音频现在很多杂音,根本用不了,求推荐一个好用的音频剪辑软件,谢谢啦” 随着科…

WordPress 网站 “Error Establishing a Database Connection” 建立数据库连接时出错的解决方法

WordPress 网站 “Error Establishing a Database Connection” 建立数据库连接时出错的解决方法 有事半年没管网站,今天突然访问网站居然出现了这个: 以下是解决方案: 检查数据库是否运行,重启数据库 1.检查数据库是否正常运…

在校学生如何白嫖黑群辉虚拟机和内网穿透,实现海量资源的公网访问?(小白专用)

文章目录 前言本教程解决的问题是:按照本教程方法操作后,达到的效果是前排提醒: 1 搭建群辉虚拟机1.1 下载黑群辉文件vmvare虚拟机安装包1.2 安装VMware虚拟机:1.3 解压黑 群辉虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群辉的解…

Purple Pi OH(Debian/Ubuntu)使用python控制gpio

本文分享的是Purple Pi OH开源主板搭载Debian/Ubuntu系统如何使用python控制gpio。 Purple Pi OH作为一款兼容树莓派的开源主板,采用瑞芯微RK3566 (Cortex-A55) 四核64位超强CPU,主频最高达1.8 GHz,算力高达1Tops,支持INT8/INT16,支持Tensor…

好玩的js特效

记录一些好玩的js特效 1、鱼跳跃特效 引入jquery:https://code.jquery.com/jquery-3.7.1.min.js 源码如下&#xff1a; <!--引入jquery--> <script src"https://code.jquery.com/jquery-3.7.1.min.js"></script> <!--引入跳跃源码--> <s…

【PHP】使用TCPDF导出PDF文件

目录 一、安装TCPDF类库 二、安装字体 三、使用TCPDF导出PDF文件 目的&#xff1a;PHP通过TCPDF类库导出文件为PDF。 开发语言及类库&#xff1a;ThinkPHP、TCPDF 效果图如下 一、安装TCPDF类库 在项目根目录使用composer安装TCPDF&#xff0c;安装完成后会在vendor目录下…

深化超低时延技术合作,中科驭数助力金仕达开创极速行情新高度

近日&#xff0c;金仕达副总经理吴江带领FPGA低延时、终端和分布式团队主要负责人赴中科驭数武汉研发中心考察调研。双方深入探讨低延时技术&#xff0c;并在FPGA国产化成果、高性能开发平台等方向展开合作研讨。以此次交流为起点&#xff0c;双方将充分发挥各自优势&#xff0…

2023-简单点-编译是什么?gcc是什么?

编译目的 把一种 程序 变成 另一种更接近机器指令 编译的术语 “接近专家的最快方法第一步&#xff0c;直接了解100行业黑话” 那么来了解一下&#xff0c;编译过程中的黑话&#xff1a; 词法分析语法分析中间代码目标代码代码优化出错管理表格管理 gcc是个什么? 一种编译…

【liunx】进程的状态

进程的状态 1.进程的状态2.僵尸进程3.孤儿进程 1.进程的状态 我们或多或少了解到进程的状态分为&#xff1a; 运行&#xff0c;新建&#xff0c;就绪&#xff0c;挂起&#xff0c;阻塞&#xff0c;等待&#xff0c;停止&#xff0c;挂机&#xff0c;死亡… 首先解释一点&…

windows系统edge浏览器退出账户后还能免密登录的解决方式

edge浏览器明明退出登录了&#xff0c;还能不用输密码一键点击就能登录&#xff1b; 这是因为微软的煞笔产品经理用脚后跟想出来的方案。 解决方案&#xff1a; 去设置里的账号管理&#xff0c;注销自己的微软账号登录&#xff1b;如果你发现自己并没有登录&#xff0c;那么看…

Spring框架中bean的生命周期(理解)

1.解释Spring框架中bean的生命周期 在传统的Java应用中&#xff0c;bean的生命周期很简单。使用Java关键字new进行bean实例化&#xff0c;然后该bean就可以使用了。一旦该bean不再被使用&#xff0c;则由Java自动进行垃圾回收。 相比之下&#xff0c;Spring容器中的bean的生命…

2023什么好用的工具可以传大文件?

在当今的信息时代&#xff0c;数据已经成为了企业和个人的重要资产。无论是视频、音乐、图片、文档等各种格式的文件&#xff0c;都需要在不同的场景和需求下进行传输或分享。然而&#xff0c;随着数据量的不断增长&#xff0c;传输或分享大文件就成了一个难题。 常见的传输方式…

SpringBoot通过自定义注解实现日志打印

目录 前言&#xff1a; 正文 一.Spring AOP 1.JDK动态代理 2.Cglib动态代理 使用AOP主要的应用场景&#xff1a; SpringBoot通过自定义注解实现日志打印 一.Maven依赖 二.ControllerMethodLog.class自定义注解 三.Spring AOP切面方法的执行顺序 四.ControllerMethodL…

WireShark抓包工具的安装

1.下载安装包 在官网或者电脑应用商城都可以下载 2.安装 打开安装包&#xff0c;点击next 点击next 选择UI界面&#xff0c;两种都装上 根据习惯选择 选择安装位置点击安装 开始安装安装成功