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

文章目录

    • 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: filelogAppend: truepath: /var/log/mongodb/mongod.log# network interfaces
net:port: 27017bindIp: 0.0.0.0# how the process runs
processManagement:fork: truetimeZoneInfo: /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, retlocal 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, retlocal 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"})--[[ mongoshdb.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 thenerror "Call	hasNext	first"endlocal r	= self.__document[self.__ptr]self.__ptr = self.__ptr	+ 1if self.__ptr >	#self.__document thenself.__ptr = nilendreturn r
end
------------------------------------------------------------------------------------------------------
function mongo_collection:findOne(query, projection)local cursor = self:find(query, projection)if cursor:hasNext() thenreturn cursor:next()endreturn 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 thendoc._id	= bson.objectid()endself.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, retlocal 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)--[[ mongoshdb.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() thenret = ret:next()endassert(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 thenlocal key_list = unfold({}, key, key_v , ...)key = bson_encode_order(table.unpack(key_list))endself.__sort = keyreturn self
endfunction mongo_cursor:skip(amount)self.__skip = amountreturn self
endfunction mongo_cursor:limit(amount)self.__limit = amountreturn self
endfunction mongo_cursor:count(with_limit_and_skip)local cmd = {'count', self.__collection.name,'query', self.__query,}if with_limit_and_skip thenlocal len = #cmdcmd[len+1] = 'limit'cmd[len+2] = self.__limitcmd[len+3] = 'skip'cmd[len+4] = self.__skipendlocal 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, rlocal 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, retlocal 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, retlocal c = create_client()local db = c[db_name]db.testcol:dropIndex("*")db.testcol:drop()local insert_docs = {}local insert_length = 10for 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 = 5for 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.mzph.cn/news/73937.shtml

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

相关文章

服务器分析和监控

在当今数字化时代,对于网络流量的分析和监控变得越来越重要。本文将详细介绍如何利用HTTPS代理服务器来实现高效、安全且可靠的流量分析与监控功能,并提供具体操作步骤以及相关技巧。无论是企业需要优化网络性能还是个人用户,在遵循法规合规前…

Android列表片段

下面创建第二个片段WorkoutFragment,它包含不同训练项目构成的一个列表,用户可以从这个列表中选择训练项目。 列表视图是只包含一个列表的片段 列表片段是一种专门处理列表的片段,它会自动绑定到一个列表视图,所以不需要另外创建…

利用procrank和lsof定位出客户软件内存OOM的问题

最近遇到一些事情,觉得挺憋屈的,可是再憋屈总得往前走吧!打工人,不好办啊!事情是这样的,笔者在芯片原厂负责SDK和行业解决方案输出的,可以理解成整体SDK turnkey方案。但是有些客户多少还要改一…

软件测试/测试开发丨ChatGPT:带你进入智能对话的新时代

简介 人工智能时代来临 我们正处于AI的iPhone时刻。——黄仁勋(英伟达CEO) ChatGPT 好得有点可怕了,我们距离危险的强人工智能不远了。——马斯克(Tesla/SpaceX/Twitter CEO) 以上的内容说明我们现在正处于一个技术大…

C# Solidworks二次开发:创建草图文本和创建草图中心线API详解

今天要介绍的是关于如何创建草图文本的API以及创建草图中心线的API,同时把一些连带的API也会和大家介绍一下,依然是满满的干货。 (1)创建草图文本API,InsertSketchText() 这个API的输入参数如下图所示: 一…

RC-u4 相对论大师(bfs求解指定路径)

PTA | 程序设计类实验辅助教学平台 题解&#xff1a; bfs可以求解从根节点到叶子节点的指定路径&#xff0c;这里的vis[]不是为了防止访问到父节点&#xff0c;更多的是为了缩小路径长度&#xff0c;mpp和mp的映射也很巧妙&#xff0c;开始我用的还是map<pair<string,s…

eNSP-抓包实验

拓扑结构图&#xff1a; 实验需求&#xff1a; 1. 按照图中的设备名称&#xff0c;配置各设备名称 2. 按照图中的IP地址规划&#xff0c;配置IP地址 3. 使用Wireshark工具进行抓ping包&#xff0c;并分析报文 4. 理解TCP三次握手的建立机制 实验步骤&#xff1a; 1、配置P…

学习MATLAB

今日&#xff0c;在大学慕课上找了一门关于MATLAB学习的网课&#xff0c;MATLAB对于我们这种自动化的学生应该是很重要的&#xff0c;之前也是在大三的寒假做自控的课程设计时候用到过&#xff0c;画一些奈奎斯特图&#xff0c;根轨迹图以及伯德图&#xff0c;但那之后也就没怎…

ROS2下使用TurtleBot3-->SLAM导航(仿真)RVIZ加载不出机器人模型

一、问题描述 在使用台式机进行仿真时&#xff0c;大部分例程很顺利&#xff0c;但在SLAM导航时&#xff0c;在RVIZ中却一直加载不出机器人模型&#xff0c;点击Navigation2 Goal选择目标点进行导航时&#xff0c;无响应。 启动后在RVIZ2和终端看到一个错误 按照官网的指令试…

【周末闲谈】如何利用AIGC为我们创造有利价值?

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言&#xff0c;模仿还是超越&#xff1f; ✨第二周 畅想AR 文章目录 系列目录前言AIGCAI写作AI绘画AI视频生成AI语音合成 前言 在此之…

ms17-010(永恒之蓝)漏洞复现

目录 前言 一、了解渗透测试流程 二、使用nmap工具对win7进行扫描 2.1 2.2 2.3 2.4 2.5 三、尝试ms17-010漏洞利用 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 四、结果展示 4.1 4.2 4.3 4.4 4.5 总结 前言 ms17-010&#xff08;永恒之蓝&am…

插入排序,选择排序,交换排序,归并排序和非比较排序(C语言版)

前言 所谓排序&#xff0c;就是将一组数据按照递增或者递减的方式进行排列&#xff0c;让这组数据变得有序起来。排序在生活中运用的是十分广泛的&#xff0c;各行各业都用到了排序&#xff0c;比如我们在网购的时候就是按照某种排序的方式来选择东西的。所以去了解排序的实现也…

【云原生】Kubeadmin部署Kubernetes集群

目录 ​编辑 一、环境准备 1.2调整内核参数 二、所有节点部署docker 三、所有节点安装kubeadm&#xff0c;kubelet和kubectl 3.1定义kubernetes源 3.2开机自启kubelet 四、部署K8S集群 4.1查看初始化需要的镜像 4.2在 master 节点上传 v1.20.11.zip 压缩包至 /opt 目录…

【多线程】线程安全 问题

线程安全 问题 一. 线程不安全的典型例子二. 线程安全的概念三. 线程不安全的原因1. 线程调度的抢占式执行2. 修改共享数据3. 原子性4. 内存可见性5. 指令重排序 一. 线程不安全的典型例子 class ThreadDemo {static class Counter {public int count 0;void increase() {cou…

Matlab之DICOM(数字图像和通信医学)格式图像数据读取函数dicomread

一、DICOM是什么&#xff1f; DICOM是数字图像和通信医学格式的图像数据&#xff0c;在MATLAB中&#xff0c;可以使用dicomread函数读取DICOM格式的图像数据。 二、dicomread函数 使用方法如下&#xff1a; imageData dicomread(filename);其中&#xff0c;filename表示DI…

Axure RP美容美妆医美行业上门服务交互原型图模板源文件

Axure RP美容美妆医美行业上门服务交互原型图模板源文件&#xff0c;原型内容属于电商APP&#xff0c;区别于一般电商&#xff0c;它的内容是‘美容美发美妆等’上门服务等。大致流程是线上买单&#xff0c;线下实体店核销消费。 附上预览演示&#xff1a;axure9.com/mobile/73…

博客程序系统其它功能扩充

一、注册功能 1、约定前后端接口 2、后端代码编写 WebServlet("/register") public class RegisterServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置…

LeetCode 3. 无重复字符的最长子串

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 我们需要找的是含重复元素的最长子串&#xff0c;当然直接暴力求解固然简单。但是可能引发的情况是超时&#xff0c;而且面试官想看到的也不是让你去暴力解决这类问题。因此我们使…

strerror函数

目录 strerror 函数介绍&#xff1a; 举例&#xff1a; 使用案例&#xff1a; 优化&#xff1a; perror&#xff1a; strerror 函数介绍&#xff1a; 函数声明&#xff1a; char * strerror ( int errnum );头 文 件&#xff1a;#include <string.h>返 回 值&a…

SpringBoot+MP操作DM8

1. 达梦数据库介绍 达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的国产高性能数据库管理系统&#xff0c;简称DM。当前最新版本是8.0版本&#xff0c;简称DM8。&#xff08;同时也是一款RDBMS&#xff0c;关系型数据库管理系统&#xff0c;和oracle比较像&#xff…