文档

基础使用

  1. 前提:开发机器已安装mongo配置环境,已启动服务。
    macOS启动服务:brew services start mongodb-community@8.0
    macOS停止服务:brew services stop mongodb-community@8.0
  2. 安装python3 -m pip install pymongo
  3. 导入import pymongo
  4. 与MongoClient建立连接client = MongoClient()
    from pymongo import MongoClient# 创建连接的三种方式:(任选一种即可)
    ## 第一种:使用默认的主机 localhost 和端口号 27017 创建连接
    client = MongoClient()
    ## 第二种:指定主机和端口创建连接
    client_1 = MongoClient("localhost", 27017)
    ## 第三种:使用url格式创建连接
    client_2 = MongoClient("mongodb://localhost:27017/")# 有账号密码时的连接
    client3 = MongoClient(f"mongodb://{username}:{password}@localhost:27017/mydatabase?authSource=admin")
    ## 或者使用独立参数
    client4 = MongoClient(host='localhost',port=27017,username='your_username',password='your_password@123',authSource='admin',  # 认证数据库
    )
    ## 若密码包含特殊字符,则需要额外处理
    from urllib.parse import quote_plus
    safe_password = quote_plus("p@ssw:rd/$")
    
  5. 获取数据库db = client.test_database
    # 获取数据库的两种方式:
    ## 第一种:通过 .数据库名 获取
    db = client.test_database
    ## 第二种:如果数据库名含特殊字符,不能使用属性样式访问时,可通过 字典式 访问
    db1 = client['test-database']
    
  6. 收集(数据库表)collection = db.test_collection
    # 获取数据库表的两种方式:
    ## 第一种:通过 .表名 获取
    collection = db.test_collection
    ## 第二种:如果表名含特殊字符,不能使用属性样式访问时,可通过 字典式 访问
    collection1 = db['test-collection']
    
  7. 文件(表数据):可以包含原生Python类型(如 datetime.datetime 实例),它们将自动转换为相应的 BSON 类型。(二进制json格式)
    # 构造表数据
    import datetime
    post = {"author": "Mike","text": "My first blog post!","tags": ["mongodb", "python", "pymongo"],"date": datetime.datetime.now(tz=datetime.timezone.utc),
    }
    
  8. 插入文档(将数据插入到数据库表中):collection.insert_one(post)
    ⚠️注意:由于延迟创建,此时(在向集合和数据库中插入第一个文档时)才会创建这些集合和数据库。
    # 将文档插入到集合中(即将数据插入到数据库表)
    post_id = collection.insert_one(post).inserted_id
    print(post_id)  # 插入数据对应的id
    # 查看集合(数据库表)
    db.list_collection_names()  # ['collection']
    
  9. 获取单个文档(获取表中某个数据):result = collection.find_one({'key':'value'})
    ⚠️注意:返回的文档包含 “_id” ,在插入时自动添加。(也可以按{'_id': ObjectId(post_id)}来查找)
    # 默认获取第一个数据
    collection.find_one()
    # 根据条件查找匹配的数据
    collection.find_one({'key':'value'})
    
  10. 大容量插入(批量插入多条数据):result = collection.insert_many(collection_data_list)
    new_posts = [{"author": "Mike","text": "Another post!","tags": ["bulk", "insert"],"date": datetime.datetime(2009, 11, 12, 11, 14),},{"author": "Eliot","title": "MongoDB is fun","text": "and pretty easy too!","date": datetime.datetime(2009, 11, 10, 10, 45),},
    ]
    result = collection.insert_many(new_posts)  # 参数为列表
    result.inserted_ids  # 可以获取插入后的id列表
    
  11. 查询多个文档result = collection.find({'key':'value'}),result是在collection表内搜索key=value的结果列表。
  12. 计数
    • 获取所有数据条数:collection.count_documents({})
    • 获取特定条件的数据条数:collection.count_documents({"author": "Mike"})
  13. 范围查询collection.find({"date": {"$lt": date_value}}).sort("author"),查询date_value日期之前的帖子,按作者对结果进行排序。
    d = datetime.datetime(2009, 11, 12, 12)
    result = collection.find({"date": {"$lt": d}}).sort("author")  # result是一个字典列表
    
  14. 索引:添加索引有助于加速某些查询,还可以为查询和存储文档添加附加功能。
    result = collection.create_index([("user_id", pymongo.ASCENDING)], unique=True)  # 将user_id设置为唯一索引
    indexs = sorted(list(collection.index_information()))  # 获取collection表中已创建的索引列表
    

PyMongo 常用方法汇总

方法使用场景示例代码关键特性
find()条件查询、数据检索db.users.find({"status": "active"}, {"name": 1, "email": 1})支持投影、排序、分页链式操作
insert_one()插入单个文档result = db.products.insert_one({"name": "Mouse", "price": 29.99})
print(result.inserted_id)
返回插入文档的_id
insert_many()批量插入文档users = [{"name": "Alice"}, {"name": "Bob"}]
result = db.users.insert_many(users, ordered=False)
支持有序/无序插入,返回插入ID列表
update_one()更新单个文档db.users.update_one(
{"_id": 123},
{"$set": {"status": "active"}}
)
使用$set避免覆盖整个文档
update_many()批量更新文档result = db.orders.update_many(
{"status": "pending"},
{"$inc": {"retries": 1}}
)
返回匹配和修改的文档计数
delete_one()删除单个文档db.sessions.delete_one({"expire_at": {"$lt": datetime.now()}})删除第一个匹配文档
delete_many()批量删除文档result = db.logs.delete_many({"created": {"$lt": datetime(2023,1,1)}})
print(result.deleted_count)
返回删除的文档数量
count_documents()统计符合条件的文档数量active_users = db.users.count_documents(
{"status": "active", "last_login": {"$gt": last_month}}
)
替代已废弃的count()方法
distinct()获取字段的唯一值列表categories = db.products.distinct("category")比聚合$group更高效
aggregate() ⚠️复杂数据分析、多阶段处理pipeline = [
{"$match": {"status": "active"}},
{"$group": {"_id": "$dept", "count": {"$sum": 1}}}
]
results = db.users.aggregate(pipeline)
支持 $match, $group, $lookup等聚合阶段,先 $match过滤比较高效
find_one()查找单个文档user = db.users.find_one({"email": "user@example.com"})直接返回文档对象或None
find_one_and_update()原子查找并更新文档task = db.tasks.find_one_and_update(
{"status": "pending"},
{"$set": {"status": "processing"}},
return_document=ReturnDocument.AFTER
)
保证操作的原子性
create_index()创建查询索引db.orders.create_index([("user_id", 1), ("create_time", -1)])显著提升查询性能
bulk_write()高性能批量操作ops = [
UpdateOne({"id": 1}, {"$inc": {"views": 1}}),
DeleteMany({"expired": True})
]
result = db.collection.bulk_write(ops, ordered=False)
减少网络往返,提升吞吐量,ordered=False无序操作更快
drop()删除整个集合db.temp_data.drop()谨慎使用,不可逆操作

根据使用场景选择对应的方法:
在这里插入图片描述

aggregate中pipeline的核心聚合操作符速查表

操作符类别功能描述语法示例
$match筛选阶段过滤文档 (类似SQL的WHERE){"$match": {"status": "active"}}
$project重塑阶段选择/重命名字段 (类似SELECT){"$project": {"name": 1, "year": {"$year": "$date"}}}
$group分组阶段按字段分组并计算聚合值{"$group": {"_id": "$dept", "total": {"$sum": "$salary"}}}
$sort排序阶段结果排序 (1升序, -1降序){"$sort": {"age": -1, "name": 1}}
$limit限制阶段限制输出文档数量{"$limit": 10}
$skip跳过阶段跳过指定数量文档{"$skip": 5}
$unwind数组处理展开数组为多条文档{"$unwind": "$tags"}
$lookup关联查询跨集合关联查询 (类似SQL JOIN){"$lookup": {
"from": "products", # 关联集合
"localField": "product_id", # 本地字段
"foreignField": "_id", # 关联集合字段
"as": "product_info" # 输出字段名}}
$addFields字段操作添加新字段 (不改变原字段){"$addFields": {"discount": {"$multiply": ["$price", 0.9]}}}
$count统计阶段返回文档总数{"$count": "total_users"}
$facet多管道处理同一输入执行多个聚合管道pipeline = [ # 单次查询获取多种统计结果
{"$facet": {
"department_stats": [ # 部门统计管道
{"$group": {... }}],
"age_distribution": [ # 年龄分布管道
{"$bucket": {... }} ],
"total_count": [ # 总计数管道
{"$count": "value"} ]
}}]

在聚合管道中使用的核心表达式操作符:

类型操作符
算术运算$add, $subtract, $multiply, $divide, $mod
比较运算$eq, $ne, $gt, $gte, $lt, $lte, $cmp
逻辑运算$and, $or, $not, $cond (三元表达式)
日期处理$year, $month, $dayOfMonth, $hour, $minute, $dateToString
字符串处理$concat, $substr, $toLower, $toUpper, $trim, $split
数组处理$size, $slice, $map, $filter, $in, $arrayElemAt
数据类型$type, $convert, $toInt, $toString, $toDate
条件处理$ifNull, $switch (多分支条件)

聚合管道优化策略

  1. 管道顺序优化原则

    输入
    $match
    $project
    $lookup
    $unwind
    $group
    $sort
    $limit/skip
    输出
  2. 性能优化技巧

    • $match$project 放在管道最前端减少数据处理量
    • $lookup 前使用 $match 过滤关联集合数据
    • 避免在 $group 中使用 $push 操作大数组
    • $sort$match 使用的字段创建索引
    • 使用 allowDiskUse=True 处理大数据集
       result = collection.aggregate(pipeline, allowDiskUse=True)
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915227.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915227.shtml
英文地址,请注明出处:http://en.pswp.cn/news/915227.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 线程池与多线程并发编程实战全解析:从异步任务调度到设计模式落地,200 + 核心技巧、避坑指南与业务场景结合

多线程编程在现代软件开发中扮演着至关重要的角色,它能够显著提升应用程序的性能和响应能力。通过合理利用异步线程、多线程以及线程池等技术,我们可以更高效地处理复杂任务,优化系统资源的使用。同时,在实际应用中,我…

gitee 分支切换

ssh-keygen -t rsa -C "pengchengzhangcplaser.com.cn" ssh -T gitgitee.comgit remote add origin 仓库地址git config --global user.email "youexample.com"git config --global user.name "Your Name"# 1. 更新远程信息 git fetch origin# …

Vue3生命周期函数

在 Vue 3 中,生命周期钩子函数是指组件从创建到销毁的整个过程中,Vue 自动调用的一些特定函数。它们让你能够在组件的不同阶段执行一些自定义操作。Vue 3 提供了组合式 API 和选项式 API 两种方式来定义生命周期钩子。1. onBeforeMount (组合式 API)作用…

基于SEP3203微处理器的嵌入式最小硬件系统设计

目录 1 引言 2 嵌入式最小硬件系统 3 SEP3202简述 4 最小系统硬件的选择和单元电路的设计 4.1 电源电路 4.2 晶振电路 4.3 复位及唤醒电路 4.5 存储器 4.5.1 FLASH存储 4.5.2 SDRAM 4.6 串行接口电路设计 4.7 JTAG模块 4.8 扩展功能(LED) …

【开源软件推荐】 SmartSub,一个可以快速识别视频/音频字幕的工具

背景介绍 我就说Github上面能找到好东西吧 事情是这样的 我最近在用PC端的剪映剪辑视频 需要用到它的语音转字幕功能 转完之后,导出的时候 发现 赫然有一项字幕识别的会员权益 我寻思看看什么价格 不贵的话就充了 好家伙,这不看不知道&#xff…

自动驾驶仿真领域常见开源工具

自动驾驶仿真领域常见开源工具1、目录1.1 自动驾驶仿真领域常见开源2、地图&场景2.1、场景播放器-Esmini4、被测对象-智驾软件4.1、Autoware4.4、端到端模型-VAD4.5、端到端模型-UniAD4.6、端到端模型-ThinkTwice4.7、端到端模型-TCP5、评价方法5.1、Leaderboard5.2、Bench…

GPU算力租用平台推荐,价格便宜且有羊毛薅,最低只要0.49/小时!

1.趋动云,这是我近期一直在用的,使用体验还不错,推荐给大家 网址:https://platform.virtaicloud.com/gemini_web/auth/register?inviteCode5f74065eac6d8867eac5c82194e2683a 是否选择一个算力平台我认为有几点需要考虑&#xff…

python学智能算法(二十五)|SVM-拉格朗日乘数法理解

引言 前序学习进程中,已经对最佳超平面的求解有了一定认识。 刚好在此梳理一下: 函数距离 首先有函数距离F,也可以称为函数间隔F: Fmin⁡i1...myi(w⋅xib)F \min_{i1...m}y_{i}(w \cdot x_{i}b)Fi1...mmin​yi​(w⋅xi​b) 几何距离 然后…

vscode 源码编译

windows 环境 下载安装 build tools Visual Studio Build Tools 勾选 C 因为安装详细信息里是 v143,所以单个组件里也要追加两个 143 的勾选 点击安装,安装好重启下电脑 Electron 安装失败:connect ETIMEDOUT 20.205.243.166:443 为防Ele…

读取和写入json,xml文件

一、JSON文件操作​ 1. 核心类​​ ​​QJsonDocument​​:表示整个JSON文档,提供解析(fromJson())和序列化(toJson())功能。 ​​QJsonObject​​:存储键值对集合,支持嵌套对象和数…

深度学习×第10卷:她用一块小滤镜,在图像中找到你

🌈【第一节 她看到的是像素点,却试图拼出你整张脸】📸 图像是什么?她从未见过你,但看见的是你的一片光斑图像,在神经网络的眼里,是一个个数字格子。这些格子,每个都有 0~255 的亮度…

计算机组成原理中的RAM:核心技术深度解析

摘要:本文深度剖析RAM在计算机体系中的核心地位,结合2025年最新技术标准与实测数据,涵盖DRAM工作原理、主流技术对比、非易失性存储革新及未来发展趋势,为硬件开发者和系统架构师提供权威技术参考。一、RAM基础原理与系统交互机制…

C语言—深入理解指针(详)

深入理解指针(详解)前言一、指针是什么1、指针的定义2、指针的大小二、指针类型1、类型2、不同类型的意义三、野指针1、野指针形成原因2、如何避免野指针四、指针的运算1、 指针整数2、指针-指针3、指针的关系运算五、const修饰指针1、consr修饰变量2、c…

小谈相机的学习过程

前言博主本人并非专职相机开发,还涉及系统的其他几个模块,虽然都属于owner,但是都还在学习探索的一个过程,自认为掌握还不够细致,此篇文章仅梳理,总结,印证自己近五年相机模块的一个学习过程&am…

CentOS7 内网服务器yum修改

1、首先确定的内网服务器是有yum源代理服务器的2、修改 /etc/yum.conf 配置文件,增加代理ip和端口号proxyhttp://ip.ip.ip.ip:port3、备份源是文件sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak4、修改配置文件 vi CentOS-Base…

基于单片机自行车自动防盗报警系统设计

摘 要 本文阐述了自行车防盗报警系统原理,介绍如何用stc89c52单片机实现防盗报警,分析各个部分的工作原理,并给出了原理图和源程序。此设计电路由震动传感器、单片机、无线超再生发射/接收电路、LED显示器和蜂鸣器组成。由于超再生接收是一种…

【深度学习】神经网络反向传播算法-part4

七、反向传播算法反向传播Back Propagation 简称 BP 。 训练神经网络的核心算法之一,通过计算损失函数,相对于每个权重参数的梯度,来优化神经网络的权重1. 前向传播前向传播是把数据经过各层神经元的运算并逐层向前传输,知道输出层…

CTF之服务器端模板注入(SSTI)与赛题

概念定义服务器端模板注入(Server-Side Template Injection)服务端接受攻击者的输入,将其作为Web应用内容的一部分,在进行代码编译渲染的过程中,进行了语句的拼接,执行了所插入的恶意内容,从而导致信息泄露、代码执行、…

除了某信,就是这款软件来替代了!

引言 哈喽,我是小索奇。有时候会有一个普遍的需求,想在几个设备之间传个文件或者发个消息,除了微信,想一想你还能用什么软件? 今天就是为了解决这个问题,给大家介绍一款软件 Localsend 来解决。 内容模块…

Vue2.x封装预览PDF组件

一、为什么用PDFObject插件? PDFObject 是一个轻量级的 JavaScript 库,主要用于在网页中嵌入和预览 PDF 文件。它通过简单的 API 调用,可以在浏览器中实现 PDF 文件的显示,而无需依赖任何插件。以下将详细介绍 PDFObject 的特点、…