实验五 Python 操作 MongoDB
【实验目的】:
1. 完成 python 操作 mongodb。
2. 掌握 pymongo 安装配置过程。
【实验内容与要求】:
安装 pymongo 方法一:
cd /home/hadoop/myshare/pymongo-3.10.1.tar.gz
tar zxvf pymongo-3.10.1.tar.gz
mv pymongo-3.10.1 /home/app/pymongo
cd /home/app/pymongo
python setup.py install
安装 pymongo 方法二:
pip install pymongo
题目一:编写 python 程序
安装方法二:
首先下载 pymongo 包:
python3 -m pip install pymongo
创建 python 文件,命名为 pyinsert.py
在 pyinsert.py 中编写如下代码:
from pymongo import MongoClient
from random import randint
name1 = ["yang ", "li ", "zhou "]
name2 = [
"chao",
"hao",
"gao",
"qi gao",
"hao hao",
"gao gao",
"chao hao",
"ji gao",
"ji hao",
"li gao",
"li hao",
]
provinces = [
"guang dong",
"guang xi",
"shan dong",
"shan xi",
"he nan"
]
client = MongoClient('mongodb://192.168.226.132:27017/')
db = client.student
sm = db.smessage
sm.delete_many({})
for i in range(1, 100):
name = name1[randint(0, 2)] + name2[randint(0, 10)]
province = provinces[randint(0, 4)]
new_student = {
"name": name,
"age": randint(1, 30),
"province": province,
"subject": [
{"name": "chinese", "score": randint(0, 100)},
{"name": "math", "score": randint(0, 100)},
{"name": "english", "score": randint(0, 100)},
{"name": "chemic", "score": randint(0, 100)},
]}
print(new_student)
sm.insert_one(new_student)
print(sm.count_documents({}))
执行 py 代码
切换至 pyinsert.py 所在目录下,执行以下命令:
python3 pyinsert.py
查看插入的数据
db.smessage.findOne()
题目二:在 mongodb shell 终端查询
查询广东学生的平均年龄。
db.smessage.aggregate({$match: {province: "guang dong"}},{$group: { _id: "$province",
age:{$avg:"$age"}}})
查询所有省份的平均年龄。
db.smessage.aggregate({$group: { _id: "$province", age:{$avg:"$age"}}})
查询广东省所有科目的平均成绩。
db.smessage.aggregate({$match: {province: "guang dong"}},{$unwind: "$subject"},{$group:
{ _id: {province:"$province",sujname:"$subject.name"}, per:{$avg:"$subject.score"}}})
在题目 2 的基础上进行排序。
db.smessage.aggregate({$match: {province: "guang
dong"}},{$unwind:"$subject"},{$group:{ _id:{province:"$province",sujname:"$subject.name"},
per:{$avg:"$subject.score"}}},{$sort:{per:1}})
查询结果如图所示:
题目三:编写 python 程序
首先下载 pymongo 包:
python3 -m pip install pymongo
创建 python 文件,命名为 pybbs.py
在 pybbs.py 中编写如下代码:
from pymongo import MongoClient
from random import randint
name = [
'yangx',
'yxxx',
'laok',
'kkk',
'ji',
'gaoxiao',
'laoj',
'meimei',
'jj',
'manwang',
]
title = [
'123',
'321',
'12',
'21',
'aaa',
'bbb',
'ccc',
'sss',
'aaaa',
'cccc',
]
client = MongoClient('mongodb://192.168.226.132:27017/')
db = client.test
bbs = db.bbs
bbs.delete_many({}) # Remove all documents from the collection
for i in range(1, 10000):
na = name[randint(0, 9)]
ti = title[randint(0, 9)]
newcard = {
'author': na,
'title': ti,
}
bbs.insert_one(newcard)
print(bbs.count_documents({})) # Count the number of documents in the collection
查看插入的数据
db.bbs.findOne()
题目四:在 mongodb shell 终端查询
查询每条记录的作者。
db.bbs.aggregate({“$project”:{“author”:1}})
用 group 将作者名称分组。
db.bbs.aggregate({"$group":{"_id":"$author","count":{"$sum":1}}})
在题目 4 的基础上进行排序。
db.bbs.aggregate({"$group":{"_id":"$author","count":{"$sum":1}}},{"$sort":{"count":-1}})
在 4 的基础上限制输出结果为 5 个
db.bbs.aggregate({"$group":{"_id":"$author","count":{"$sum":1}}},{"$sort":{"count":-1}}, {"$limit":5})
思考题:如何更安全的访问 MongoDB 数据库?
要更安全地访问MongoDB数据库,可以采取以下几个步骤:
1. 启用身份验证:在MongoDB中创建用户并分配合适的权限,然后启用身份验证。这样只有经过身份验证的用户才能访问数据库。
2. 使用强密码:确保为MongoDB用户设置强密码,包括足够的长度和复杂性。避免使用容易猜测的密码,最好使用密码管理工具来生成和存储密码。
3. 使用TLS/SSL加密:通过启用TLS/SSL加密,在数据库连接过程中对数据进行加密传输,确保数据在传输过程中的安全性。
4. 限制网络访问:将MongoDB实例设置为仅接受来自可信源的连接,例如特定IP地址或经过安全网络隔离的服务器。
5. 更新和维护数据库:定期更新MongoDB和相关驱动程序以获取最新的安全性补丁。此外,监控和审计数据库活动,以便及时发现和应对任何潜在的安全问题。
6. 定期备份数据:定期备份MongoDB数据库,以防止数据丢失或意外删除。确保备份数据存储在安全的位置,并测试恢复过程以验证备份的完整性和可用性。
完成Python操作MongoDB的代码已经在前面提供过了,你可以使用pymongo库来操作MongoDB数据库。记得按照安全的最佳实践来编写代码,例如使用安全的身份验证、加密通信等。
小结
完成 python 操作 mongodb。
在本次任务中,我们完成了使用Python操作MongoDB数据库的代码。我们使用了pymongo库来连接MongoDB并执行一些常见的操作,如插入文档、查询文档和更新文档。
要注意的是,当访问MongoDB数据库时,需要确保使用安全的方法来保护数据和系统的安全性。以下是一些常见的最佳实践:
- 启用身份验证并为用户设置强密码,以便只有经过身份验证的用户才能访问数据库。
- 使用TLS/SSL加密来保护数据在传输过程中的安全性。
- 限制网络访问,只允许来自可信源的连接,并进行必要的网络隔离和防火墙设置。
- 定期更新数据库和相关驱动程序以获取最新的安全性补丁。
- 定期备份数据以防止数据丢失,并确保备份数据存储在安全的位置。
遵循这些安全性最佳实践将有助于保护MongoDB数据库和相关数据的安全性和完整性。在编写代码时,还应注意处理异常、输入验证和安全编码等方面,以防止潜在的安全漏洞。