Python 连接 Mongodb 数据库
背景
MongoDB 是由 C 语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似 JSON 对象,它的字段值可以包含其他文档、数组以及文档数组,非常灵活。
连接 MongoDB
Mongo 没有开启认证
连接 MonogoDB 时,我们需要使用 PyMonogo 中的 MongoClient。连接 MongoDB 有两种形式
方式一:传入 host 和 port
-
import pymongo
-
-
client = pymongo.MongoClient(host='127.0.0.1', port=27017)
方式二:传入 ‘mongodb://{host}:{port}’
-
import pymongo
-
-
client = pymongo.MongoClient('mongodb://127.0.0.1:27017')
以上两种形式均可创建 MongoDB 的连接对象。
Mongo 开启认证
连接方式
pymongo 版本小于 3.9
-
import pymongo
-
-
client = pymongo.MongoClient(host='127.0.0.1', port=27017)
-
# db 表示数据库名称,username 用户名 password 密码
-
client.db.authenticate(useranme, password)
pymongo 版本大于等于 4.0
-
from pymongo import MongoClient
-
-
client = MongoClient(host='127.0.0.1', port=27017, username='root', password='admin', authSource='test')
注意:需要根据项目下载的版本选择不同的认证方式,否则会导致认证失败
指定数据库
MongoDB 中可以建立多个数据库,下面我们可以指定操作某个数据库,下面我们以 test 数据库为例
-
# 建立数据库连接
-
db = client.test # or db = client['test']
指定集合
MongoDB 的每个数据库又包含多个集合(collection),可以把他们看作关系型数据库中的表,下面我们指定一个集合,这里我们指定集合为 student,同样指定集合也有两种方式
collection = db.students # or collection = db['students']
插入数据
插入数据也有多种方式
插入单条数据
- insert_one:插入单条数据
-
student = {
-
'id': 1,
-
'name': 'test',
-
}
-
res = collection.insert_one(student)
-
print(res, res.inserted_id)
说明:在 MongoDB 中,每条数据其实都有一个 _id 属性来唯一标识。如果没有显式指明该属性,MongoDB 会自动生成一个 ObjectId 类型的 _id 属性。insert_one 中返回的 object 中 inserted_id 可以获取该属性
插入多条数据
- insert_many:插入多条数据
-
studends = [
-
{
-
'id': 1,
-
'name': 'test',
-
},
-
{
-
'id': 2,
-
'name': 'test2',
-
}
-
]
-
res = collection.insert_many(studends) # >>> [ObjectId('623def841a44a3456deff68d'), ObjectId('623def841a44a3456deff68e')]
更新数据
更新操作和插入操作类似,Pymongo 提供了两种更新方法,即 update_one() 和 update_many() 方法,其中 update_one() 方法只会更新满足条件的第一条记录
- 如果使用 $set,则只更新 object 对象内已经存在的字段,如果更新前还有其他字段,则不更新也不删除
- 如果不使用 $set,则会把更新的数据全部用 object 对象替换,如果原本存在其他字段则会被删除
-
# 更新满足条件{'id', 2}的第一条记录,将 id 更新为 3
-
res = collection.update_one({'id': 2}, {'$set': {'id': 3, 'age': 10}})
-
-
# 更新返回结果是一个对象,我们可以调用matched_count和modified_count属性分别获得匹配的数据条数和影响的数据条数。
-
print(res.matched_count, res.modified_count)
-
#打印结果:1 1
-
-
# 更新满足条件 id>1 的所有记录,id 字段自加 100
-
res = collection.update_many({'id': {'$gt': 1}}, {'$inc': {'id': 100}})
-
-
# 打印更新匹配和影响的记录数
-
print(res.matched_count, res.modified_count)
-
#打印结果:1 1
-
-
stu = {'id': 4, 'name': 'test3'}
-
#upsert=True表示如果没有满足更新条件的记录,则会将stu插入集合中
-
res = collection.update_one({'id': 4}, {'$set': stu}, upsert=True)
-
print(res.matched_count, res.modified_count)
-
#打印结果:0 0
查询数据
插入数据后,我们可以利用 find_one() 或者 find() 方法进行查询
- find_one():查询单个
-
res = collection.find_one({'id': 2})
-
print(res) # >>> {'_id': ObjectId('623def841a44a3456deff68e'), 'id': 2, 'name': 'test2'}
- find():查询多个
-
res = collection.find({'id': 1})
-
print(list(res))
-
-
# >>> [{'_id': ObjectId('623dd9c8e9fd60c3b848759d'), 'id': 1.0, 'name': 'test'}, {'_id': ObjectId('623de23f8345ac3b087d264e'), 'id': 1, 'name': 'test'}]
删除数据
删除数据同样有两种方法,delete_one() 和 delete_many()
- delete_one():删除符合条件的一条记录
- delete_many():删除符合条件的所有记录
-
# 删除满足条件的第一条记录
-
res = collection.delete_one({'id': 1})
-
# 同样可以通过返回对象的 deleted_count 属性查询删除的记录数
-
print(result.deleted_count)
-
# 打印结果:1
-
-
# 删除满足条件的所有记录,以下为删除 page < 90 的记录
-
result = collection.delete_many({'id': {'$lt': 2}})
-
print(result.deleted_count)
-
# 打印结果:2
条件查询
条件比较符如下表:
如果要查询 id 大于 3 的数据,写法如下
results = collection.find({'id': {'$ge': 3}})
功能符号进行归类如下表
具体操作可以查看官网提供文档:https://docs.mongodb.com/manual/reference/operator/query/
计数
在某些场景下我们需要统计一共有多少条数据,可以调用 count() 方法。find() 中还可以增加过滤条件
count = collection.find().count()
排序
排序是时直接调用 sort() 方法,并在其中传入排序的字段及升、降序标志即可
- 升序:pymongo.ASCENDING
- 降序:pymongo.DESCENDING
-
# 按照 id 降序
-
res = collection.find().sort('id', DESCENDING)
-
print(list(res))
更多操作请查看 Pymongo 文档:https://pymongo.readthedocs.io/en/stable/index.html
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfbceff
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13