MongoDB数据库的优点
MongoDB简介
MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在 为 WEB 应用提供可扩展的高性能数据存储解决方案。将数据存储为一个文档(类似JSON对象),数据结构由键值(key=>value)对组成支持丰富的查询表达,可以设置任何属性的索引,也可以嵌套文档来表示层次关系,并存储诸如数组之类的结构。

MongoDB是一个介于非系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
MongoDB优势
MongoDB: MongoDB 最好的事情之一是对模式设计没有限制。您可以只在集合中放置几个文档,并且不需要与这些文档有任何关系。
但是,由于缺乏连接和事务,您需要根据应用程序访问数据的方式经常优化架构。
MySQL:在 MySQL 中存储任何内容之前,您需要明确定义表和列,并且表中的每一行都应该具有相同的列。正因为如此,如果遵循规范化,存储数据的方式就没有太多的灵活性空间。
- 当您需要模式的灵活性时,MongoDB 是最好的选择。您可以轻松地将副本集与 MongoDB 结合使用,并利用可扩展性。扩展计划非常灵活,可以通过向系统添加更多机器和 RAM 来轻松实现。它还包括文档验证和集成系统。
- MongoDB 的缺点包括一段时间内数据量较大。由于缺乏原子事务,与NoSQL相比速度相对较低。此外,该解决方案还处于初级阶段,因此无法直接替换遗留系统。
- MySQL 已经存在很长时间了。主要优点之一是它是社区驱动的。作为一个成熟的解决方案,它支持 JOIN、具有权限和密码安全系统的原子事务。
- 使用 MySQL,您可能无需投入大量时间和精力,而其他平台可能会自动为您完成这些工作,例如增量备份。MySQL 的主要问题是可扩展性。没有内置的 XML 和 OLAP。
(1)文档结构的存储方式,能够更便捷的获取数据,单个对象的结构是明确的。
(2)性能优越。在使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。
(3)深度查询能力。MongoDB使用与SQL一样强大的基于文档的查询语言支持对文档的动态查询。
(4)第三方支持丰富。开源的文档数据库MongoDB背后有商业公司为它提供商业培训和支持。
(5)全索引支持,扩展到内部对象和内嵌数组,没有复杂的连接。
小贴士:虽然MongoDB优势不少,但是在使用时也有注意一些缺点,比如不支持事务操作、占用空间过大,没有如MySQL那样成熟的维护工具。
MongoDB概念解析
在MongoDB中有3个比较核心概念,那就是文档、集合、数据库,下面通过一个表格与SQL术语进行对比,帮助你对它有更深理解:
| SQL概念 | MongoDB概念 | 解释说明 |
|---|---|---|
| database | database | 数据库 |
| table | collection | 数据库表 / 集合 |
| row | document | 数据记录行 / 文档 |
| column | field | 数据字段 / 域 |
| index | index | 索引 |
| table joins | 表连接 ,MongoDB 不支持 | |
| primary key | primary key | 主键 ,MongoDB 自动将 _id 字段设置为主键 |
MongoDB安装
1、先获取mongodb镜像
docker pull mongo:4.2
2、镜像拉取完成后,运行mongodb容器
docker run \
-d \
--name mongo \
--restart=always \
--privileged=true \
-p 27017:27017 \
-v /home/mongodb/data:/data/db \
mongo:4.2 --auth

3、mongodb服务配置
如上图,mongodb起来之后,进入容器,配置账户,具体执行命令如下:
#进入容器
docker exec -it mongo /bin/bash
#登录mobodb
mongo admin
#创建一个名为 root,密码为 123456 的用户。
db.createUser({ user:'root',pwd:'123456',roles:[{ role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
4、容器内部测试是否可用
登录mongodb数据库,创建集合users,验证数据库是否可以正常使用,命令如下:
#尝试使用上面创建的用户信息进行连接。
db.auth('root', '123456')
#选择admin库
use admin
#创建集合users
db.createCollection('users')
#插入数据
db.users.insert({"name":"小李","age": NumberInt(33)})
#查看数据
db.users.find()
5、本地navicat客户端连接Mongodb
首先要保证服务器开启27017端口,然后用公网IP加27017测试是否能访问(服务器要开放27017端口),当然如果是本地虚拟机搭建用虚拟机的IP+27017端口测试就行。

然后用navicat新建mongodb连接测试没有正常访问。

连接成功后,打开数据库可能什么都看不到,需要选择navicat菜单栏查看按钮把显示隐藏项目勾选上就可以了。

6、后续运维命令
#停止、重启、删除容器命令
docker stop mongo #停止
docker start mongo # 启动
docker rm mongo #删除容器
Python操作MongoDB
Python操作MongoDB主要依赖于pymongo库,这是一个官方的MongoDB驱动程序,用于与MongoDB数据库进行交互。以下是一些基本的步骤和示例,展示如何使用Python和pymongo来操作MongoDB。
1. 安装pymongo
首先,你需要安装pymongo库。你可以使用pip来安装:
bash复制代码
pip install pymongo
2. 连接到MongoDB
创建一个MongoDB客户端,并连接到MongoDB服务器。如果你使用的是本地MongoDB实例,并且使用的是默认端口(27017),那么连接将非常简单。
from pymongo import MongoClient
# 创建MongoDB客户端
client = MongoClient('mongodb://localhost:27017/')
# 获取数据库,如果不存在则创建
db = client['mydatabase'] # 使用mydatabase作为数据库名
# 获取集合,如果不存在则创建
collection = db['mycollection'] # 使用mycollection作为集合名
3. 插入数据
使用insert_one()或insert_many()方法来插入数据。
# 插入单条数据
document = {"name": "Alice", "age": 30}
result = collection.insert_one(document)
print(f"Inserted document with ID: {result.inserted_id}")
# 插入多条数据
documents = [
{"name": "Bob", "age": 25},
{"name": "Charlie", "age": 35}
]
result = collection.insert_many(documents)
print(f"Inserted {len(result.inserted_ids)} documents")
4. 查询数据
使用find_one()或find()方法来查询数据。
# 查询单个文档
result = collection.find_one({"name": "Alice"})
print(result)
# 查询多个文档
results = collection.find({"age": {"$gt": 28}}) # 查询年龄大于28的文档
for doc in results:
print(doc)
5. 更新数据
使用update_one()或update_many()方法来更新数据。
# 更新单个文档
result = collection.update_one({"name": "Alice"}, {"$set": {"age": 31}})
print(f"Matched {result.matched_count} documents and updated {result.modified_count}")
# 更新多个文档
result = collection.update_many({"age": {"$lt": 30}}, {"$set": {"status": "young"}})
print(f"Matched {result.matched_count} documents and updated {result.modified_count}")
6. 删除数据
使用delete_one()或delete_many()方法来删除数据。
# 删除单个文档
result = collection.delete_one({"name": "Bob"})
print(f"Deleted {result.deleted_count} document")
# 删除多个文档
result = collection.delete_many({"age": {"$gt": 30}})
print(f"Deleted {result.deleted_count} documents")
7. 关闭连接
在完成所有操作后,建议关闭MongoDB客户端连接。
client.close()
以上只是pymongo库的基本用法示例。实际上,pymongo提供了许多其他功能和选项,例如索引管理、聚合管道、事务处理等,你可以查阅官方文档来了解更多高级用法:https://pymongo.readthedocs.io/en/stable/。