当前位置: 首页 > news >正文

docker安装mongoDB及使用

一.mongodb是什么?

MongoDB是一个NoSQL的非关系型数据库 ,支持海量数据存储,高性能的读写

1.mongo的体系结构

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,MongoDB不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

2. mongoDB的特点(或使用场景)

  1. 支持存储海量数据;(例如:直播中的打赏数据);

  2. 支持频繁的数据读写;(例如:游戏道具);

  3. 数据安全性不高,存在数据误差(丢失数据);

  4. mongoDB不支持多表操作,不支持事务;

  5. mongoDB使用Bson存储格式,支持动态字段管理;

3. mongoDB与mysql、redis对比

与redis对比

1. redis纯内存数据库,内存不足时触发淘汰策略,mongoDB使用内存加磁盘的存储策略具有高扩展性;
2. mongoDB使用Bson存储格式,支持动态字段管理方便扩展

与mysql对比

1. mongoDB不支持多表操作,不支持事务;
2. mongoDB使用Bson存储格式,支持动态字段管理;

查询效率对比

Redis > MongoDB > MySQL

4. mongoDB存储原理

在这里插入图片描述

  1. mongoDb采用内存加磁盘的方式存储数据

  2. mongoDb支持数据分片,当单一的服务器中磁盘不够用的时候,还可以串联其他服务器;

  3. 客户端的请求到达内存时,先在日志中记录下操作记录,然后再去操作内存;

  4. 内存中的日志每10ms向磁盘中的日志进行同步一次,数据则每分钟同步一次;

  5. 客户端先去内存中查询数据,内存中没有再去查询磁盘;

  6. 当客户端写入的时候,会先写入到内存中,内存中写入后请求直接返回,内存中的数据会根据同步策略同步到磁盘;

  7. 如果机器宕机,在重启服务的时候会解析磁盘中的日志和磁盘中的数据进行对比,将未入到磁盘中的数据写入磁盘,但可能会丢失10ms的数据;

二. 使用docker安装mongo

1.安装

1.拉取mongo镜像

 docker pull mongo:4.4

2. 创建mongo数据持久化目录

mkdir -p /docker_volume/mongodb/data

3. 运行容器

docker run -itd --name mongo -v /docker_volume/mongodb/data:/data/db -p 27017:27017 mongo:4.4 --auth
  1. -v: 将宿主机的/docker_volume/mongodb/data映射到容器的/data/db目录,将数据持久化到宿主机,以防止删除容器后,容器内的数据丢失

  2. –auth:需要密码才能访问容器服务

2.创建用户

1. 登录mongo容器,并进入到【admin】数据库

 docker exec -it mongo mongo admin

2. 创建一个用户,mongo 默认没有用户

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

【user:‘root’ 】:设置用户名为root 【pwd:‘123456’】:设置密码为123456 【role:‘userAdminAnyDatabase’】:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 【db: ‘admin’】:可操作的数据库 【‘readWriteAnyDatabase’】:赋予用户读写权限

dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile

3. 连接、测试

1. 连接mongo数据库

db.auth('root', '123456')

2. 测试数据库,插入一条语句

 db.user.insert({"name":"zhangsan","age":18})

3. 测试数据库,查询刚才插入的语句

 db.user.find()

4.navicat连接测试

在这里插入图片描述

三. 项目使用mongodb

1. 常用命令

#查看已经存在的数据库
show dbs;
#创建数据库
use 数据库名
#删除数据库
db.dropDatabase()
#查看集合
show collections;
#创建集合
db.createCollection("news")
#删除集合
db.runoob.drop()
#添加数据
db.集合名.insert({'id':1,'title':'12'})
#查询所有
db.集合名.find()
#删除数据
db.集合名.remove({"id":1})
#条件查询
db.集合名.find({"id":1})

2. pymongo使用

1. 安装

pip install pymongo

2. pymysql连接

import pymongo
from urllib import parse
username = parse.quote_plus('mofang')   # 对用户名进行编码
password = parse.quote_plus('123456')  # 对密码进行编码
database = "mofang" # 数据库名称
host     = "127.0.0.1"
port     = "27017"
mongo = pymongo.MongoClient('mongodb://%s:%s@%s:%s/%s' % ( username, password, host, port, database))

3. 数据库操作

import pymongo# 数据库连接
mongo = pymongo.MongoClient("mongodb://127.0.0.1:27017/")# 创建数据库
my_db  = mongo["my_db"] # 没有往集合里面保存文档之前,mongdb不会真正创建集合!# 查看数据库列表
print(mongo.list_database_names()) # 上面的 my_db 因为没有内容,所以没有被创建的。

4. 集合操作

import pymongomongo = pymongo.MongoClient("mongodb://127.0.0.1:27017/")
my_db = mongo["my_db"]my_collection = my_db["my_collection"] # 没有往集合里面保存文档之前,mongdb不会真正创建集合!# 查看集合列表
print(my_db.list_collection_names())# 删除集合
my_collection.drop() # 删除成功返回true,如果集合不存在,返回false

5. 添加

import pymongo
mongo = pymongo.MongoClient("mongodb://127.0.0.1:27017/")
my_db = mongo["my_db"]
my_collection = my_db["my_collection"]# 添加一个文档
document = { "name": "xiaoming", "mobile": "13012345678","age":16}
ret = my_collection.insert_one(document)
print(ret.inserted_id) # 返回InsertOneResult对象
# 插入文档时,如果没有指定_id,将自动分配一个唯一的id。# 添加多个文档
document_list = [{ "name": "xiaoming", "mobile": "13033345678","age":17},{ "name": "xiaohong", "mobile": "13044345678","age":18},{ "name": "xiaohei",  "mobile": "13612345678","age":18},
]
ret = my_collection.insert_many(document_list)# 打印文档_id值列表:
print(ret.inserted_ids)

6. 删除

import pymongomongo = pymongo.MongoClient("mongodb://127.0.0.1:27017/")
my_db = mongo["my_db"]
my_collection = my_db["my_collection"]# 删除一个文档
query = {"name":"xiaoming"}
my_collection.delete_one(query)# 删除多个文档
query = { "mobile": {"$regex": "^130"} }
ret = my_collection.delete_many(query)
print("删除了%d个文档" % ret.deleted_count)import pymongo
from urllib.parse import quote_plusfrom bson import ObjectIdif __name__ == "__main__":username = quote_plus("mofang")password = quote_plus("123456")# 获取数据库连接对象mongo = pymongo.MongoClient(f"mongodb://{username}:{password}@127.0.0.1:27017/mofang")mofang = mongo["mofang"]user_list = mofang["user_list"]"""删除文档"""query = {"_id": ObjectId("60d925e127bd4b7769251002")}ret = user_list.delete_one(query)print(ret)print(ret.deleted_count)"""删除多个文档"""query = {"name": "xiaolan"}ret = user_list.delete_many(query)print(ret.deleted_count)

7. 更新

import pymongomongo = pymongo.MongoClient("mongodb://127.0.0.1:27017/")
my_db = mongo["my_db"]
my_collection = my_db["my_collection"]# 更新一个文档
query = { "name": "xiaoming" }
data = { "$set": { "age": 18 } }
my_collection.update_one(query, data)# 更新所有文档
query = { "mobile": {"$regex": "^130"} }
data = { "$set": { "age": 18 } }
my_collection.update_many(query, data)

8. 查询

import pymongomongo = pymongo.MongoClient("mongodb://127.0.0.1:27017/")
my_db = mongo["my_db"]
my_collection = my_db["my_collection"]# 查看一个文档
ret = my_collection.find_one()
print(ret)# 查看所有文档
for document in my_collection.find():print(document)# 查看文档部分字段,find和find_one的第二个参数表示控制字段的显示隐藏,1为显示,0为隐藏
for document in my_collection.find({},{ "_id": 0, "name": 1, "mobile": 1 }):print(document)# 条件查询
query = { "age": 18 }
document_list = my_collection.find(query)
for document in document_list:print(document)# 比较运算符
query = { "age": {"$gt":17} }
document_list = my_collection.find(query)
for document in document_list:print(document)# 排序显示
# 单个字段排序:
#         sort("键", 1) 升序
#         sort("键",-1) 降序# 多个字段排序:
#       sort([("键1",1),("键2",-1)])
document_list = my_collection.find().sort("age")
for document in document_list:print(document)# 限制查询结果数量
document_list = my_collection.find().limit(3)
print(document_list)# 偏移、跳过
#    skip(int)
document_list = my_collection.find().limit(3).skip(3) # 从第3篇文档开始获取3篇文档
print(document_list)# 自定义条件函数
document_list = my_collection.find({"$where":"this.age==18"})
print(document_list)
select o.create_time,o.status,o.account,od.name,od.count,od.price from orders as o inner join detail as od on o.number=od.order_id where userid=o.userid order by o.create_time desc

评价

相关文章:

docker安装mongoDB及使用

一.mongodb是什么? MongoDB是一个NoSQL的非关系型数据库 ,支持海量数据存储,高性能的读写 1.mongo的体系结构 SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档colum…...

Linux 之五:权限管理(文件权限和用户管理)

1. 文件权限 在Linux系统中,文件权限是一个非常基础且重要的安全机制。它决定了用户和用户组对文件或目录的访问控制级别。 每个文件或目录都有一个包含9个字符的权限模式,这些字符分为三组,每组三个字符,分别对应文件所有者的权限…...

基于YOLOv8深度学习的葡萄病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...

MySQL 在聚合函数查询的结构中继续过滤

HAVING HAVING 关键字和 WHERE 关键字都可以用来过滤数据&#xff0c;且 HAVING 支持 WHERE 关键字中所有的操作符和语法,如果想要从 GROUP BY 分组中进行筛选的话&#xff0c;不是用 WHERE 而是使用 HAVING 来进行聚合函数的筛选。 语法 SELECT <列名1>, <列名2>,…...

UE4.27_ParticleSystem(没写完的材料)

UE4.27_ParticleSystem&#xff08;没写完的材料&#xff09; 参考实例&#xff1a; UE4[蓝图]下雪效果及雪的材质的实现...

腾讯云轻量服务器流量用完了怎么办?停机吗?

腾讯云轻量服务器流量用完了怎么办&#xff1f;超额流量另外支付流量费&#xff0c;流量价格为0.8元/GB&#xff0c;会自动扣你的腾讯云余额&#xff0c;如果你的腾讯云账号余额不足&#xff0c;那么你的轻量应用服务器会面临停机&#xff0c;停机后外网无法访问&#xff0c;继…...

块级作用域、变量提升

1.块级作用域 JS 中作用域有&#xff1a;全局作用域、函数作用域。没有块作用域的概念。ECMAScript 6(简称 ES6)中新增了块级作用域。块作用域由 { } 包括&#xff0c;if 语句和 for 语句里面的{ }也属于块作用域。 2.变量提升 如果变量声明在函数里面&#xff0c;则将变量声…...

c# 连接oracle 及对应获取数据集

1、数据库配置xml&#xff0c;首先连接成功后会自动创建xml并保存到对应xml&#xff0c;如下 static string ConnPath AppDomain.CurrentDomain.BaseDirectory "ConnOrcle.xml"; 声明xml名称&#xff0c;便于后续写入对应数据库参数 2、创建xml /// <summar…...

JS直接量及其相关对象

什么是直接量 直接量是指不需要创建对象就可以直接使用的变量。ES中的直接量主要有三种类型&#xff1a;表示字符串的string类型、表示数字的number类型和表示true/false的boolean类型。当我们直接将值赋给变量后&#xff0c;ES就会自动判断其类型&#xff0c;而且当参数发生变…...

一 windso10 笔记本刷linux cent os7.9系统

1:准备材料 16G以上U盘, 笔记本一台 镜像选了阿里云镜像:centos-7-isos-x86_64安装包下载_开源镜像站-阿里云 软件:链接&#xff1a;https://pan.baidu.com/s/13WDp2bBU1Pdx4gRDfmBetg 提取码&#xff1a;09s3 2:把镜像写入U盘,本人已经写入好了,选择镜像,点开始就是,确定等…...

118.龙芯2k1000-pmon(17)-制作ramdisk

目前手上这个设备装系统不容易&#xff0c;总是需要借助虚拟机才能实现。 对生产就不太那么友好&#xff0c;能否不用虚拟机就能装Linux系统呢&#xff1f; 主要是文件系统的问题需要解决&#xff0c;平时我们一般是用nfs挂载后&#xff0c;然后对硬盘格式化&#xff0c;之后…...

IP-guard邮件管控再升级,记录屏幕画面,智能阻断泄密邮件

邮件是工作沟通以及文件传输的重要工具,却也成为了信息泄露的常见渠道。员工通过邮件对外发送了什么内容,是否含有敏感信息都无从得知,机密通过邮件渠道外泄也难以制止。想要防止企业的重要信息通过邮件方式泄露,我们不仅需要通过技术措施对外发邮件的行为进行规范,也要对…...

#LLM入门|Prompt#2.10_评估、自动化测试效果(下)——当不存在一个简单的正确答案时 Evaluation Part2

上一章我们探索了如何评估 LLM 模型在 有明确正确答案 的情况下的性能&#xff0c;并且我们学会了编写一个函数来验证 LLM 是否正确地进行了分类列出产品。 在使用LLM生成文本的场景下&#xff0c;评估其回答准确率可以是一个挑战。由于LLM是基于大规模的训练数据进行训练的&am…...

round四舍五入在python2与python3版本间区别

round()方法返回数值的小数点四舍五入到n个数字。 语法 以下是round()方法的语法&#xff1a; round( x ,n) 参数 x --这是一个数值&#xff0c;表示需要格式化的数值 n --这也是一个数值,表示小数点后保留多少位 返回值 该方法返回 数值x 的小数点四舍五入到n个数字 …...

新概念英语第二册(73)

【New words and expressions】生词和短语&#xff08;9&#xff09; record-holder 纪录保持者 truant n. 逃学的孩子unimaginative adj. 缺乏想像力的shame n. 惭愧&#xff0c;羞耻 hitchhike v. 搭便车旅行 m…...

Vue项目实战-空间论坛(2)

项目实战 实现userlist页面 获取userlist列表&#xff0c;可使用ajax,axios 实现 这里采用ajax实现&#xff0c;需要添加Jquery依赖&#xff0c;然后在UserListView.vue中引入 在UserListView.vue组件的入口函数中定义users变量&#xff0c;并引入ref 使用ajax从云端动…...

小老虎吃汉堡,认识continue和break

continue;//结束本次循环&#xff0c;执行下面的循环 break; //结束本次及以后的循环&#xff0c;执行循环下面的代码1. /*小老虎在吃汉堡&#xff0c;但是第三个汉堡上被挤了芥末&#xff0c;不能吃&#xff0c;跳过去又吃第四、五个*/ for (int i1;i<5;i){if (i3){contin…...

docker搭建zero-ui

确保你已经安装了Docker和Docker Compose。如果没有&#xff0c;请参照官方文档安装&#xff1a;Docker 和 Docker Compose。 使用 Docker CLI 获取 Zero-UI 镜像: 首先&#xff0c;你需要从Docker Hub获取Zero-UI的Docker镜像。你可以使用 docker pull 命令来下载它。 docker…...

187基于matlab的弹道目标跟踪滤波方法

基于matlab的弹道目标跟踪滤波方法&#xff0c;扩展卡尔曼滤波&#xff08;extended Kalman filter, EKF&#xff09;、转换测量卡尔曼滤波&#xff08;conversion measurement Kalman filter, CMKF&#xff09;跟踪滤波&#xff0c;得到距离、方位角、俯仰角误差结果。程序已调…...

讲给自己听的的技术---WMS

标题一 点题 为什么我会说&#xff0c;这是说给自己听的了&#xff1f;做项目有三个月了&#xff0c;外加之前三个月的自学&#xff0c;自我感觉对WMS系统有了一点了解&#xff0c;今天三月九号晚上九点二十&#xff0c;就让我自己和自己说说吧。 标题二 WMS的职责是什么…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...