ToB企服应用市场:ToB评测及商务社交产业平台
标题:
数据库 - Mongo数据库
[打印本页]
作者:
梦见你的名字
时间:
2024-10-5 13:13
标题:
数据库 - Mongo数据库
目录
媒介
一、MongoDB的特点
二、Mongo的核心概念
三、MongoDB的优劣势
四、使用场景
五、MongoDB与其他数据库的对比
六、如何安装MongoDB
七、数据库指令操作
(一)基本数据库操作
(1)毗连 MongoDB
(2)表现所有数据库
(3)选择数据库
(4)表现当前数据库
(二)聚集操作
(1)表现聚集列表
(2)创建聚集
(3)删除聚集
(三)文档(数据)操作
(1)插入文档
(2)查询文档
(3)更新文档
(4)删除文档
(四)索引操作
(1)创建索引
(2)检察索引
(3)删除索引
(五)聚合操作
(1)基本聚合查询
(2)聚合操作符
(六)备份与恢复
(1)数据库备份
(2)数据库恢复
(七)常用条件查询符号
八、使用python操作MongoDB
(一)安装PyMongo
(二)毗连 MongoDB 数据库
(三)选择数据库
(四)选择聚集
(五)插入文档
(1)插入单个文档
(2)插入多个文档
(六)查询文档
(1)查询单个文档
(2)查询多个文档
(3)查询并格式化输出
(七)、更新文档
(1)更新单个文档
(2)更新多个文档
(3)更新操作符
(八)删除文档
(1)删除单个文档
(2)删除多个文档
(3)删除聚集
(九)创建索引
(1)创建单字段索引
(2)创建复合字段
(3)检察索引
(4)删除索引
(十)聚合操作
(十一)数据库和聚集的管理
(1)检察所有数据库
(2)检察聚集列表
(3)删除数据库
(十二)完整代码示例
九、总结
媒介
MongoDB 是一种开源的、面向文档的 NoSQL 数据库,由 MongoDB Inc. 开发和维护。它与传统的关系型数据库(如 MySQL、PostgreSQL)不同,使用 JSON 风格的 BSON(二进制 JSON)数据格式来存储数据,因此数据的格式更加灵活、易于扩展。由于其强盛的扩展性、分布式结构和高效的查询能力,MongoDB 成为了当代大数据应用和云计算情况中常用的数据库之一。
一、MongoDB的特点
Mongo数据库的特点主要有以下几点:
文档存储
:MongoDB 将数据存储为类似 JSON 格式的文档(Document),但采用的是 BSON(二进制 JSON)格式。这使得数据模式更具灵活性和可扩展性。
模式自由(Schema-less)
:与关系型数据库中需要事先定义表的模式(Schema)不同,MongoDB 不要求在创建数据时预定义字段类型,字段可以在不同文档中具有不同的结构。
高效的查询语言
:MongoDB 提供了强盛的查询功能,如聚合操作(Aggregation)、全文搜刮(Full-text search)等,可以或许快速处理复杂的数据分析。
分布式架构
:支持分片(Sharding)和复制集(Replica Set),可以轻松实现高可用性、容错性和横向扩展,可以或许在多台服务器上分散和复制数据。
内置索引功能
:MongoDB 支持各种类型的索引,如单字段索引、复合索引、地理空间索引等,大幅提高数据查询服从。
自动故障恢复
:通过主从复制(Replication)和自动故障转移(Automatic failover),MongoDB 可以或许在服务器宕机时自动恢复服务。
二、Mongo的核心概念
Mongo的核心概念主要包罗以下几点:
(1)数据库(Database)
数据库是 MongoDB 中存储数据的最外层容器。每个 MongoDB 实例可以包罗多个数据库。
(2)聚集(Collection)
类似于关系型数据库中的表,一个聚集包罗多个文档。聚集不需要预定义数据模式,因此每个文档可以有不同的字段和数据类型。
(3)文档(Document)
文档是 MongoDB 中的基本数据单位,类似于关系型数据库中的行。文档使用 BSON(Binary JSON)格式存储,可以包罗嵌套数组和子文档,结构非常灵活。
(4)字段(Field)
字段是文档中存储数据的键值对(Key-Value Pair)。它类似于关系数据库中的列(Column)。
(5)索引(Index)
索引用于提高数据库的查询服从。MongoDB 支持多种索引类型,包罗单字段索引、复合索引和地理空间索引等。
(6)聚集锁(Locking)
MongoDB 使用聚集级别的锁而非数据库级别的锁,因此可以或许在某种程度上实现并发操作,提高了多用户情况下的访问性能。
(7)复制集(Replica Set)
复制集是 MongoDB 中用于高可用性和故障恢复的机制。一个复制集由一个主节点(Primary)和一个或多个从节点(Secondary)组成。主节点用于处理写操作,而从节点用于读取和备份数据。
(8)分片(Sharding)
分片是一种将数据程度切分到多个服务器的技能。MongoDB 的分片机制可以实现数据的自动分布、负载均衡和高性能处理。
三、MongoDB的优劣势
优势:
灵活的文档模型:
文档模型更接近现实世界的数据结构,不需要固定的数据模式(Schema)。
高效的读写性能:
MongoDB 的插入和查询操作速度较快,得当处理大规模的数据集。
可扩展性:
支持程度扩展(通过分片)和自动数据分片(Sharding)。
丰富的功能:
支持全文搜刮、数据聚合、索引管理、地理空间数据处理等多种复杂操作。
内置复制与容错:
通过复制集(Replica Set)实现数据冗余和自动故障恢复,保障数据安全。
劣势:
数据一致性问题:
MongoDB 默认使用最终一致性模型,因此在某些场景下可能出现短暂的读写不一致。
高内存消耗:
由于使用 BSON 格式存储数据,比传统的 JSON 格式占用更多的内存空间。
复杂的管理:
对于分布式体系和分片机制的管理难度较高,维护起来需要较高的技能程度。
四、使用场景
MongoDB的使用场景主要有:
(1)内容管理体系(CMS)
得当使用 MongoDB 存储内容管理体系中的文章、博客、产物描述等信息。文档模型可以很轻易地表现各种内容类型。
(2)大数据分析
MongoDB 的聚合框架(Aggregation Framework)和 MapReduce 可以高效地进行数据分析和挖掘。
(3)实时数据处理
适用于需要实时处理海量数据的场景,如交际网络数据流、日志分析、在线广告数据等。
(4)物联网(IoT)
由于 MongoDB 可以处理高吞吐量的写入操作,得当用于存储物联网设备的大量传感器数据。
(5)电商应用
MongoDB 可以用来存储商品目录、用户信息、订单数据,而且可以或许通过分片轻松扩展数据库容量。
五、MongoDB与其他数据库的对比
特性MongoDBMySQLRedis数据模型文档模型关系模型键值对数据格式BSON 格式表格模式内存中的键值对程度扩展支持分片通过分区实现支持集群模式读写性能较高(特别是海量数据场景中等,取决于索引极高(在内存中操作)事务支持仅支持多文档事务完整事务支持不支持事务主要使用场景内容管理、大数据、实时数据处理传统业务体系、金融数据管理缓存、实时分析、消息队列
六、如何安装MongoDB
MongoDB 可以在 Windows、macOS 和 Linux 体系上安装。具体步调根据操作体系有所不同。通常,使用以下命令即可启动 MongoDB 服务:
1.安装(以 Ubuntu 为例)
:
sudo apt-get update
sudo apt-get install -y mongo
db
复制代码
2.启动 MongoDB 服务:
sudo service mongo
db
start
复制代码
七、数据库指令操作
(一)基本数据库操作
(1)毗连 MongoDB
mongo
复制代码
毗连默认的当地 MongoDB 实例。如果需要毗连远程服务器,使用以下命令:
mongo
<server_ip>:<port>
复制代码
比方,毗连远程 IP 地址 192.168.1.100 的 27017 端口:
mongo
192.168.1.100:27017
复制代码
(2)表现所有数据库
show db
s
复制代码
该命令用于列出当前 MongoDB 实例上的所有数据库,并表现每个数据库的大小。
(3)选择数据库
use <database_name>
复制代码
比方,选择 test 数据库:
use test
复制代码
注意:
如果该数据库不存在,使用 use 命令时会自动创建该数据库,但该数据库在插入数据之前不会被现实创建。
(4)表现当前数据库
db
复制代码
该命令表现当前操作的数据库名称。
(二)聚集操作
(1)表现聚集列表
show collections
复制代码
列出当前数据库中的所有聚集,类似于 SQL 中的表。
(2)创建聚集
db
.createCollection("<collection_name>")
复制代码
比方,创建一个名为 students 的聚集:
db
.createCollection("students")
复制代码
(3)删除聚集
db
.<collection_name>.drop()
复制代码
比方,删除 students 聚集:
db
.students.drop()
复制代码
(三)文档(数据)操作
(1)插入文档
MongoDB 使用 insert()、insertOne()、或 insertMany() 方法插入文档。
db
.<collection_name>.insert({ <document> })
复制代码
比方,在 students 聚会合插入一个文档:
db
.students.insert({ name: "John", age: 18, grade: "A" })
复制代码
插入多个文档:
db
.students.insertMany([ { name: "Alice", age: 19, grade: "B" }, { name: "Bob", age: 20, grade: "C" }])
复制代码
(2)查询文档
使用 find() 方法来查询聚会合的数据。
db
.<collection_name>.find({ <query_conditions> })
复制代码
比方,查询 students 聚会合所有年事大于 18 的文档:
db
.students.find({ age: { $gt: 18 } })
复制代码
查询结果格式化输出:
db
.students.find().pretty()
复制代码
(3)更新文档
使用 update() 或 updateOne()、updateMany() 来更新文档。
db
.<collection_name>.update( { <query_conditions> }, { $set: { <new_values> } })
复制代码
比方,将 name 为 John 的门生的年事更新为 19:
db
.students.update( { name: "John" }, { $set: { age: 19 } })
复制代码
如果只想更新第一个匹配项,可以使用 updateOne:
db
.students.updateOne( { name: "John" }, { $set: { grade: "A+" } })
复制代码
注意:
在 MongoDB 中,默认的 update 操作会替换整个文档,如果不使用 $set 操作符,则会丢失未指定的字段。
(4)删除文档
使用 remove() 方法删除符合条件的文档。
db
.<collection_name>.remove({ <query_conditions> })
复制代码
比方,删除 name 为 Alice 的文档:
db
.students.remove({ name: "Alice" })
复制代码
如果只删除第一个匹配项,可以指定 justOne 参数:
db
.students.remove({ name: "Alice" }, { justOne: true })
复制代码
(四)索引操作
(1)创建索引
使用 createIndex() 方法为字段创建索引:
db
.<collection_name>.createIndex({ <field_name>: <1 | -1> })
复制代码
比方,在 email 字段上创建升序索引:
db
.users.createIndex({ email: 1 })
复制代码
(2)检察索引
db
.<collection_name>.getIndexes()
复制代码
比方,检察 users 聚集的索引:
db
.users.getIndexes()
复制代码
(3)删除索引
db
.<collection_name>.dropIndex({ <field_name>: <1 | -1> })
复制代码
比方,删除 email 字段上的索引:
db
.users.dropIndex({ email: 1 })
复制代码
(五)聚合操作
MongoDB 提供了强盛的聚合框架,可以对文档进行复杂的数据处理。
(1)基本聚合查询
使用 aggregate() 方法进行聚合操作:
db
.<collection_name>.aggregate([ { <stage1> }, { <stage2> }, ... ])
复制代码
比方,按 age 字段进行分组,并计算每个年事段的用户数目:
db
.users.aggregate([ { $group: { _id: "$age", total: { $sum: 1 } } }])
复制代码
(2)聚合操作符
$match:过滤文档,类似 find() 中的查询条件。
$group:对文档进行分组,并执行聚合操作。
$project:修改输出文档的结构,只保留所需字段。
$sort:对结果进行排序。
比方,按年事降序分列 users 聚会合的所有文档:
db
.users.aggregate([ { $sort: { age: -1 } }])
复制代码
(六)备份与恢复
(1)数据库备份
使用 mongo
dump 命令行工具进行备份:
mongo
dump --db
<database_name> --out <backup_directory>
复制代码
比方,将 test 数据库备份到 ./backup 目录:
mongo
dump --db
test --out ./backup
复制代码
(2)数据库恢复
使用 mongo
restore 工具进行数据库恢复:
mongo
restore --db
<database_name> <backup_directory>
复制代码
比方,从 ./backup 目录恢复 test 数据库:
mongo
restore --db
test ./backup/test
复制代码
(七)常用条件查询符号
MongoDB常用的查询符号有以下几种:
$eq:等于(相当于 SQL 中的 =)
$gt:大于
$gte:大于等于
$lt:小于
$lte:小于等于
$ne:不等于
$in:在指定命组中的任意值
$nin:不在指定命组中的任意值
$and:多个条件全部成立
$or:多个条件任意一个成立
$not:条件不成立时
$exists:字段是否存在
$regex:使用正则表达式匹配字段内容
八、使用python操作MongoDB
在 Python 中使用 MongoDB 通常需要使用 pymongo
库,这是一个官方提供的 MongoDB 驱动步伐,可以帮助我们在 Python 中轻松地进行数据库操作。下面,我将详细介绍如何通过 pymongo
进行 MongoDB 的毗连、数据库操作、聚集管理、数据操作等。
(一)安装PyMongo
在开始之前,请确保已经安装了 pymongo
库。可以使用以下命令进行安装:
pip install pymongo
复制代码
(二)毗连 MongoDB 数据库
首先,需要使用 pymongo
创建一个数据库毗连。毗连 MongoDB 的语法格式如下:
from pymongo
import MongoClient# 创建一个 MongoDB 客户端client = MongoClient("mongo
db
://localhost:27017/")
复制代码
这里 localhost:27017 是默认的 MongoDB 服务器地址和端口号。如果你的 MongoDB 服务器在其他主机或使用了自定义端口,可以根据现实情况修改毗连字符串,比方:mongo
db
://username:password@server_ip:port/。
(三)选择数据库
在 MongoDB 中,每个数据库由多个聚集组成。可以使用 client.<database_name> 或者 client['database_name'] 来选择数据库:
# 选择数据库(如果数据库不存在,会在插入数据时创建)db
= client['test_database']
复制代码
(四)选择聚集
聚集类似于关系数据库中的表。可以使用 db
.<collection_name> 或者 db
['collection_name'] 来选择聚集:
# 选择聚集(如果聚集不存在,会在插入数据时创建)collection = db
['users']
复制代码
(五)插入文档
(1)插入单个文档
使用 insert_one() 插入单个文档:
# 插入一个文档
user = {"name": "Alice", "age": 25, "email": "alice@example.com"}
collection.insert_one(user)
复制代码
(2)插入多个文档
使用 insert_many() 插入多个文档:
# 插入多个文档
users = [
{"name": "Bob", "age": 30, "email": "bob@example.com"},
{"name": "Charlie", "age": 28, "email": "charlie@example.com"},
]
collection.insert_many(users)
复制代码
(六)查询文档
(1)查询单个文档
使用 find_one() 查询单个文档:
# 查询 name 为 "Alice" 的文档
result = collection.find_one({"name": "Alice"})
print(result)
复制代码
(2)查询多个文档
使用 find() 查询符合条件的所有文档。可以通过 for 循环遍历查询结果:
# 查询所有年龄大于 25 的用户
results = collection.find({"age": {"$gt": 25}})
for user in results:
print(user)
复制代码
(3)查询并格式化输出
使用 pprint 模块对查询结果进行格式化输出:
from pprint import pprint
# 查询所有文档,并格式化输出
results = collection.find({})
for user in results:
pprint(user)
复制代码
(七)、更新文档
(1)更新单个文档
使用 update_one() 更新第一个符合条件的文档:
# 将 name 为 "Alice" 的用户的年龄更新为 26
collection.update_one({"name": "Alice"}, {"$set": {"age": 26}})
复制代码
(2)更新多个文档
使用 update_many() 更新所有符合条件的文档:
# 将所有年龄大于 25 的用户的 email 域名改为 "example.org"
collection.update_many({"age": {"$gt": 25}}, {"$set": {"email": "user@example.org"}})
复制代码
(3)更新操作符
$set:设置一个字段的值(如果字段不存在,则创建)
$unset:删除字段
$inc:递增或递减某个字段的值
$rename:重定名字段
比方,将用户 Bob 的年事增加 5 岁:
collection.update_one({"name": "Bob"}, {"$inc": {"age": 5}})
复制代码
(八)删除文档
(1)删除单个文档
使用 delete_one() 删除第一个符合条件的文档:
# 删除 name 为 "Charlie" 的文档
collection.delete_one({"name": "Charlie"})
复制代码
(2)删除多个文档
使用 delete_many() 删除所有符合条件的文档:
# 删除所有年龄小于 30 的用户
collection.delete_many({"age": {"$lt": 30}})
复制代码
(3)删除聚集
删除整个聚集:
# 删除集合 users
collection.drop()
复制代码
(九)创建索引
索引是提高查询速度的一个重要机制。可以通过 create_index() 方法为某个字段创建索引。
(1)创建单字段索引
# 为 name 字段创建升序索引
collection.create_index([("name", 1)])
复制代码
(2)创建复合字段
# 为 name 和 age 字段创建复合索引
collection.create_index([("name", 1), ("age", -1)])
复制代码
(3)检察索引
# 查看当前集合的所有索引
print(collection.index_information())
复制代码
(4)删除索引
# 删除 name 字段上的索引
collection.drop_index("name_1")
复制代码
(十)聚合操作
聚合操作是处理和分析数据的一个强盛功能。比方,统计每个年事段用户的数目:
# 按 age 字段分组,并统计每个年龄的用户数量
pipeline = [
{"$group": {"_id": "$age", "count": {"$sum": 1}}}
]
results = collection.aggregate(pipeline)
for result in results:
print(result)
复制代码
(十一)数据库和聚集的管理
(1)检察所有数据库
print(client.list_database_names())
复制代码
(2)检察聚集列表
print(db
.list_collection_names())
复制代码
(3)删除数据库
client.drop_database('test_database')
复制代码
(十二)完整代码示例
以下是一个完整的 MongoDB 操作示例代码:
from pymongo
import MongoClient# 毗连 MongoDBclient = MongoClient("mongo
db
://localhost:27017/")db
= client['test_database']collection = db
['users']# 插入数据collection.insert_one({"name": "Alice", "age": 25, "email": "alice@example.com"})# 查询数据user = collection.find_one({"name": "Alice"})print("查询结果:", user)# 更新数据collection.update_one({"name": "Alice"}, {"$set": {"age": 26}})print("更新后的数据:", collection.find_one({"name": "Alice"}))# 删除数据collection.delete_one({"name": "Alice"})print("删除后的数据:", collection.find_one({"name": "Alice"}))# 关闭数据库毗连client.close()
复制代码
九、总结
MongoDB 是一个功能强盛、灵活且易于扩展的 NoSQL 数据库,特别得当处理复杂的、非结构化的数据以及大规模数据存储和分布式摆设。尽管在事务处理和数据一致性上与传统的关系数据库(如 MySQL、PostgreSQL)存在差距,但在大数据和高并发场景下,它提供了更多的优势和可扩展性。通过合理配置和管理,MongoDB 可以为当代 Web 应用、云计算、大数据等范畴提供强有力的支持。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4