Python使用PyMongo4.x操作MongoDB总结

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: PyMongo是一个Python编程语言中用于连接和操作MongoDB数据库的库。它提供了丰富的功能和API,使开发者能够在Python中轻松地进行MongoDB的数据交互和管理。

Python操作MongoDB

概述

PyMongo是一个Python编程语言中用于连接和操作MongoDB数据库的库。它提供了丰富的功能和API,使开发者能够在Python中轻松地进行MongoDB的数据交互和管理。

MongoDB 驱动程序:https://api.mongodb.com/

PyMongo文档:https://pymongo.readthedocs.io/en/stable/api/index.html

MongoDB文档:https://www.mongodb.com/docs/manual/

安装Python库

pip install pymongo==4.3.3

注意:不同版本的PyMongo在语法和API方面可能会有差异一定差异

连接、认证

# 导入模块
from pymongo import *

# 创建客户端对象,使用账号登录
# 方式一:
'''
host:连接的主机名或IP地址,默认为localhost
port:连接使用的端口号,默认为27017
username:用于身份验证的用户名,默认为None
password:用于身份验证的密码,默认为None
authSource:用于身份验证的数据库,默认为None,表示使用admin数据库
'''
client = MongoClient(host="ip", port=27017, username="test", password="123456", authSource="demo")

# 方式二:
# url = "mongodb://test:123456@ip/demo"
# client = MongoClient(url)


# 断开与MongoDB的连接
client.close()

创建数据库、集合

# 判断数据库是否已存在
dblist = client.list_database_names()
if "demo" in dblist:
  print("demo 数据库已存在!")


# 创建、获取数据库对象
db = client.demo
db = client['demo']

#  判断集合是否存在
collist = db . list_collection_names()
if "user" in collist:  
  print("user 集合已存在!")

# 创建、获取集合
collection = db.user
collection = db["user"]

注意: 在 MongoDB 中,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建。

新增

MongoDB 中的一个文档类似 SQL 表中的一条记录。

单条插入

集合中插入一个文档使用 insert_one() 方法,该方法的第一参数是字典

result = collection.insert_one({
   "name": "Python", "age": 25})
# 插入操作是否被确认
print(result.acknowledged)  # True
# 插入文档的 _id 字段的值。如果文档没有设置 _id 字段,则 inserted_id 的值为一个新生成的 ObjectId。
print(result.inserted_id)  # 63f569b89a8014989e3b53f6

# 批量插入
result = collection.insert_many([{
   "name": "Java", "age": 55}, {
   "name": "Vue", "age": 33}])
# 插入操作是否被确认
print(result.acknowledged)  # True
# 插入的所有文档的 _id 值的列表。
print(result.inserted_ids)  # [ObjectId('63f569b89a8014989e3b53f7'), ObjectId('63f569b89a8014989e3b53f8')]

批量插入

集合中插入多个文档使用 insert_many()方法,该方法的第一参数是字典列表

result = collection.insert_many([{
   "name": "Java", "age": 55}, {
   "name": "Vue", "age": 33}])
# 插入操作是否被确认
print(result.acknowledged)  # True
# 插入的所有文档的 _id 值的列表。
print(result.inserted_ids)  # [ObjectId('63f569b89a8014989e3b53f7'), ObjectId('63f569b89a8014989e3b53f8')]

查询

MongoDB 中使用了 find 和 find_one 方法来查询集合中的数据,它类似于 SQL 中的 SELECT 语句。

查询单条

使用find_one()方法来查询集合中的一条数据

result = collection.find_one({
   "name": "Python"})
print(result)

查询多条

使用find() 方法查询集合中的所有数据

rows = collection.find({
    "name": "Python"})
for row in rows:
    print(row)

查询指定字段的数据

使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1

注意:除了 _id,不能在一个对象中同时指定 0 和 1

rows = collection.find({
    },{
     "_id": 0, "name": 1, "age": 1 }):
for x in 
  print(x)

根据指定条件查询

可以在 find() 中设置参数来过滤数据

query = {
     "name": "java" }
result = collection.find(query)
for document in result:
    print(document)

高级查询

查询条件语句中使用修饰符

# 查询年龄大于等于30
query = {
    "age": {
    "$gte": 30 } }
result = collection.find(query)
for document in result:
    print(document)

使用正则表达式查询

可以使用正则表达式作为修饰符

# 查看name 字段中以字母'java'开头的数据
query = {
     "name": {
     "$regex": "^java" } }
result = collection.find(query)
for document in result:
    print(document)

返回指定条数记录

要对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数

result = collection.find().limit(3)
for x in result:
  print(x)

查询选择器

比较操作符

符号 描述 示例
$eq 匹配等于指定值的值 {'age': {'$eq': 20}}
$lt 匹配小于指定值的值 {'age': {'$lt': 20}}
$lte 匹配小于或等于指定值的值 {'age': {'$lte': 20}}
$gt 匹配大于指定值的值 {'age': {'$gt': 20}}
$gte 匹配大于或等于指定值的值 {'age': {'$gte': 20}}
$ne 匹配所有不等于指定值的值 {'age': {'$ne': 20}}
$in 匹配数组中指定的任何值 {'age': {'$in': [20, 30]}}
$nin 不匹配数组中指定的任何值 {'age': {'$nin': [20, 30]}}

逻辑操作符

符号 描述 示例 说明
$and 查询同时满足多个条件的文档 query = { "$and": [ {"name": "electronics"}, {"age": {"$lt": 30}} ] }

result = collection.find(query)
查询了name为"electronics"且age小于30的数据
$not 查询不满足指定条件的文档 query = { "age": { "$not": {"$gt": 50} # 不大于50 } } 查询了age不大于50的数据
$nor 查询不满足任何指定条件的文档 query = { "$nor": [ {"name": "electronics"}, {"age": {"$gt": 50}} ] } 查询name既不属于"electronics",也不满足age大于50的数据
$or 查询满足任意一个指定条件的文档 query = { "$or": [ {"name": "electronics"}, {"age": {"$gt": 50}} ] } 查询了name满足"electronics"或age大于50的数据

其他常见操作符

符号 描述 示例
$regex 匹配正则表达式 {'name': {'$regex': '^java.*'}}
$exists 属性是否存在 {'name': {'$exists': True}}
$text 文本查询 { '$text': {'$search': 'java'}}
$where 高级条件查询 {'$where': 'this.name.length > 5'}
$type 类型判断 {'age': {'$type': 'int'}}
$mod 对字段进行取模运算

这里:5是除数,0是余数
{'age': {'$mod': [5, 0]}}

更新

更新单条

使用 update_one()方法修改文档中的记录,方法第一个参数为查询的条件,第二个参数为要修改的字段。

如果查找到的匹配数据多于一条,则只会修改第一条

'''
matched_count:符合筛选条件的文档数
modified_count:实际被更新的文档数
upserted_id:如果执行的是 upsert 操作,则包含新插入文档的 _id 值
'''
result = collection.update_one({
   "name": "Python"}, {
   "$set": {
   "age": 25}})
print(result.matched_count)
print(result.modified_count)
print(result.upserted_id)


# 不存在就插入
data = {
   "name": "Python", "age": 25}
client.test.test.update_one({
   'name': 'Java'}, {
   '$set': data}, upsert=True)

批量更新

使用update_many()方法修改多个文档中的记录,会修改所有匹配到的记录

collection.update_many({
   "name": "Python"}, {
   "$set": {
   "age": 22}})

# 不存在就插入
data = {
   "name": "Python", "age": 25}
client.test.test.update_one({
   'name': 'Java'}, {
   '$set': data}, upsert=True)

删除

删除文档

使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据

'''
acknowledged:一个布尔值,表示操作是否被确认(即是否执行成功)
deleted_count:一个整数,表示被删除的文档数量
'''
result = collection.delete_one({
    "name": "Python"})
print(result.acknowledged)
print(result.deleted_count)

批量删除

使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据

collection.delete_many({
    "age": {
    "$gt": 20}})

删除集合中的所有文档

delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档

x = user.delete_many({
   })
print(x.deleted_count, "个文档已删除")

db.user.delete_many({
   })

删除集合

使用drop()方法来删除一个集合。

# 返回true:删除成功
# 返回false:删除失败(集合不存在)
collection.drop()

其他

排序

sort()方法可以指定升序或降序排序。

第一个参数为要排序的字段,第二个字段指定排序规则,1为升序,-1为降序,默认为升序。

升序

result = collection.find().sort("age")
for x in result:
  print(x)

降序

result = collection.find().sort("age", -1)
for x in result:
  print(x)

计数

可以使用count()方法查询结果有多少条数据

count = collection.find().count()

query = {
    "age": {
    "$gte": 30 } }
count = collection.find(query).count()

分组查询

在MongoDB中,可以使用聚合管道(aggregation pipeline)来实现分组查询

# 构建聚合管道
pipeline = [
    {
   "$group": {
   "_id": "$category", "total_sales": {
   "$sum": "$amount"}}},
    {
   "$sort": {
   "total_sales": -1}},
    {
   "$limit": 3}
]

# 执行聚合查询
result = collection.aggregate(pipeline)
for document in result:
    print(document)
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
1月前
|
数据格式 Python
如何使用Python的Pandas库进行数据透视图(melt/cast)操作?
Pandas的`melt()`和`pivot()`函数用于数据透视。基本步骤:导入pandas,创建DataFrame,然后使用这两个函数转换数据格式。示例代码展示了如何通过`melt()`转为长格式,再用`pivot()`恢复为宽格式。输入数据是包含'Name'和'Age'列的DataFrame,最终结果经过转换后呈现出不同的布局。
40 6
|
1月前
|
Unix Shell Linux
赞!优雅的Python多环境管理神器!易上手易操作!
赞!优雅的Python多环境管理神器!易上手易操作!
|
19天前
|
人工智能 机器人 C++
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
|
4天前
|
JSON 数据格式 索引
python 又一个点运算符操作的字典库:Munch
python 又一个点运算符操作的字典库:Munch
21 0
|
7天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
129 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
8天前
|
索引 Python
如何使用Python的Pandas库进行数据透视表(pivot table)操作?
使用Pandas在Python中创建数据透视表的步骤包括:安装Pandas库,导入它,创建或读取数据(如DataFrame),使用`pd.pivot_table()`指定数据框、行索引、列索引和值,计算聚合函数(如平均分),并可打印或保存结果到文件。这允许对数据进行高效汇总和分析。
10 2
|
15天前
|
数据采集 JSON 网络协议
「Python系列」Python urllib库(操作网页URL对网页的内容进行抓取处理)
`urllib` 是 Python 的一个标准库,用于打开和读取 URLs。它提供了一组模块,允许你以编程方式从网络获取数据,如网页内容、文件等。
36 0
|
25天前
|
缓存 NoSQL 关系型数据库
【MongoDB】MongoDB更新操作时是否立刻fsync到磁盘?
【4月更文挑战第2天】【MongoDB】MongoDB更新操作时是否立刻fsync到磁盘?
|
25天前
|
Python
python使用tkinter库,封装操作excel为GUI程序
python使用tkinter库,封装操作excel为GUI程序
|
26天前
|
消息中间件 NoSQL Kafka
云原生最佳实践系列 5:基于函数计算 FC 实现阿里云 Kafka 消息内容控制 MongoDB DML 操作
该方案描述了一个大数据ETL流程,其中阿里云Kafka消息根据内容触发函数计算(FC)函数,执行针对MongoDB的增、删、改操作。