Python操作MongoDB - 常用操作

news2024/11/29 2:51:39

1、连接MongoDB

可以下载使用客户端:MangoDB Compass

# 连接数据库,INT_MONGO是INT环境mongo的连接串
mongo_client = pymongo.MongoClient(INT_MONGO)

2、访问数据库

# 访问数据库Pytest
db = mongo_client["Pytest"]

3、创建集合(表)

# 向Pytest数据库中,创建一个集合(表)Test1,无数据
# 如果该集合不存在则创建成功,返回集合的信息;
# 若该集合已存在,则创建失败:pymongo.errors.CollectionInvalid: collection Test1 already exists
try:
    print(db.create_collection("Test1"))
except CollectionInvalid:
    print("collection Test1 already exists")

4、删除集合(表)

# 删除Pytest数据库中的集合(表)Test1
# 即使该集合不存在,执行这条命令也不会报错
# 删除成功的返回值: {'ok': 1.0, 'operationTime': Timestamp(1708425975, 6), '$clusterTime': {'clusterTime': Timestamp(1708425975, 6), 'signature': {'hash': b'\x8a\xdf\x87\xe1\x16\xc4\xde\xc8EV<\xf6\xf0\xf0R\xb1\x1a\xdax1', 'keyId': 7304497515062099969}}}
print(db.drop_collection("Test1"))

5、查看已创建的集合(表)

# 查看已有集合
collections = db.list_collections()
for collection in collections:
    print(collection)

6、访问集合(表)

# 访问数据表
table = db["Test1"]

7、插入数据

7.1 insert_one()

# 用于向集合插入一个新文档(向数据表中插入一条新记录)
table.insert_one({"title": 'MongoDB',
                  "description": 'MongoDB 是一个 Nosql 数据库',
                  "by": 'Tester',
                  "tags": ['mongodb', 'database', 'NoSQL'],
                  "likes": 100
                  })

7.2 insert_many()

# 向集合中插入多个文档
# writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求
# ordered:指定是否按顺序写入,默认 true,按顺序写入
table.insert_many([{"title": 'MongoDB1',
                    "description": 'MongoDB 是一个 Nosql 数据库',
                    "by": 'Tester',
                    "tags": ['mongodb', 'database', 'NoSQL'],
                    "likes": 90
                    }, {"title": 'MongoDB2',
                        "description": 'MongoDB 是一个 Nosql 数据库',
                        "by": 'Tester',
                        "tags": ['mongodb', 'database', 'NoSQL'],
                        "likes": 88
                        }])

7.3 向不存在的集合插入数据

# 如果该集合不存在,但是对该集合执行插入操作,那么 MongoDB 会自动创建该集合并插入文档
table3 = db["Test3"]
table3.insert_one({"title": 'MongoDB',
                   "description": 'MongoDB 是一个 Nosql 数据库',
                   "by": 'Tester',
                   "tags": ['mongodb', 'database', 'NoSQL'],
                   "likes": 70
                   })

8、查询数据

8.1 find()

# 查询文档,对多条文档的查询,可以使用find方法
results = table.find({"title": 'MongoDB'})
print(results)   # 返回的是个对象
print(type(results))  # 返回结果是Cursor类型,它相当于一个生成器,我们需要遍历取到所有的结果,其中每个结果都是字典类型。
for result in results:
    print(result)

在这里插入图片描述

8.2 find_one()

# find_one,仅返回第一条数据。返回结果是一个dict
print(table.find_one({"title": 'MongoDB777'}))   # 不存在,返回None
print(table.find_one({"title": 'MongoDB'}))  # 存在,返回结果,是dict

在这里插入图片描述

8.3 通过objectid查询

from bson import ObjectId


# _id属性是MongoDB在插入过程中自动添加的。可以根据ObjectId来查询,导入bson库里的objectid。如果结果不存在返回None
print(table.find_one({'_id': ObjectId('661279d4b1955ec1908c51b4')}))

8.4 find_one_and_update

# 查找后更新,将title更新成MongoDB-xxxx
result = table.find_one_and_update({'_id': ObjectId('661279d4b1955ec1908c51b4')}, {'$set': {"title": "MongoDB-xxxx"}})
print(result)
print(table.find_one({'_id': ObjectId('661279d4b1955ec1908c51b4')}))

在这里插入图片描述

8.5 find_one_and_replace

# 查找后替换,replacement预期是填写的整条记录。下面这个替换之后,此条记录仅有一个字段title
result = table.find_one_and_replace({'_id': ObjectId('661279d4b1955ec1908c51b4')},
                                     {'title': 'MongoDB-replace',
                                      'description': 'MongoDB 是一个 Nosql 数据库', 'by': 'Tester',
                                      'tags': ['mongodb', 'database', 'NoSQL'], 'likes': 100})
print(result)
print(table.find_one({'_id': ObjectId('661279d4b1955ec1908c51b4')}))

在这里插入图片描述

8.6 find_one_and_delete

# 查找后删除,将删除这条记录
result = table.find_one_and_delete({'_id': ObjectId('661279d4b1955ec1908c51b4')})
print(result)
print(table.find_one({'_id': ObjectId('661279d4b1955ec1908c51b4')}))  # 已删除,返回None

在这里插入图片描述

8.7 find(),添加过滤条件

# 大于
# 查询返回的结果是Cursor类型,它相当于一个生成器,我们需要遍历取到所有的结果,其中每个结果都是字典类型。如果结果为空,则返回[]
print([result for result in table.find({"likes": {"$gt": 80}})])
# 小于
print([result for result in table.find({"likes": {"$lt": 90}})])
# 小于等于
print([result for result in table.find({"likes": {"$lte": 88}})])

# 大于等于
print([result for result in table.find({"likes": {"$gte": 90}})])

# 不等于
print([result for result in table.find({"likes": {"$ne": 90}})])

# 在范围内,包括80和100
print([result for result in table.find({"likes": {"$in": [80, 100]}})])

# 不在范围内,闭区间,取小于80和大于100的值
print([result for result in table.find({"likes": {"$nin": [90, 100]}})])

# 正则表达式,查询title以M开头的数据
print([result for result in table.find({"title": {"$regex": "^M.*"}})])

# title属性是否存在
print([result for result in table.find({"title": {"$exists": True}})])

# 类型判断,likes的类型是否是int
print([result for result in table.find({"title": {"$type": "int"}})])  # []
print([result for result in table.find({"likes": {"$type": "int"}})])

# 数字运算,例如mod操作,likes模5余0
print([result for result in table.find({"likes": {"$mod": [5, 0]}})])

# 文本查询,title中包含MongoDB
# print([result for result in table.find({"$text": {"$search": "MongoDB"}})])

# 高级条件查询
print([result for result in table.find({"$where": "obj.likes <= 88"})])

8.8 升序

# 升序排列
print([result for result in table.find({"$where": "obj.likes <= 100"}).sort("likes", pymongo.ASCENDING)])

8.9 降序

# 降序排列
print([result for result in table.find({"$where": "obj.likes <= 100"}).sort("likes", pymongo.DESCENDING)])

8.10 统计结果的count

# 统计结果的count
print(len(list(table.find({"$where": "obj.likes <= 99"}))))

9、偏移

# 偏移。在某些情况下,我们可能想只取某几个元素,这时可以利用skip()方法偏移几个位置,比如偏移1,就忽略第一个元素,得到第二个及以后的元素
print([result for result in table.find({"$where": "obj.likes >= 80"}).sort("likes", pymongo.DESCENDING).skip(0)])
print([result for result in table.find({"$where": "obj.likes >= 80"}).sort("likes", pymongo.DESCENDING).skip(1)])

10、limit

# limit方法指定要取的结果个数
print([result for result in table.find({"$where": "obj.likes >= 80"}).sort("likes", pymongo.DESCENDING).limit(1)])
# 在数据库数量非常庞大的时候,如千万、亿级别,最好不要使用大的偏移量来查询数据,因为这样很可能导致内存溢出。此时可以使用类似如下操作来查询
print([result for result in table.find({"_id": {"$gt": ObjectId('661279d4b1955ec1908c51b5')}})])

11、更新文档

11.1 update_one

# 过滤条件查询后,如果有多条记录,那么update one仅对第一条记录进行修改
table.update_one({"title": 'MongoDB'}, {"$set": {"description": "MongoDB 是一个 Nosql 数据库aaaaaaaaaa"}})

11.2 update_many

# 过滤条件查询后,如果有多条记录,那么update many将对所有记录进行修改。如果缺少该字段,将添加此字段;如果已存在,那就更新数据
table.update_many({"title": 'MongoDB'}, {"$set": {"description": "MongoDB update"}})

12、删除数据

12.1 delete_one

# 过滤条件查询后,如果有多条记录,仅删除第一条记录
table.delete_one({"title": 'MongoDB'})

12.2 delete_many

# 过滤条件查询后,如果有多条记录,将全部删除
table.delete_many({"title": 'MongoDB'})

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件加密软件大全,按市场份额排名

文件加密软件大全&#xff0c;按市场份额排名 文件加密是一种保护数据安全的重要手段&#xff0c;通过使用特定的算法将明文文件转化为密文&#xff0c;以防止未经授权的访问、篡改或泄露&#xff0c;市场份额排名的八款软件你需要了解一下。 1、安企神软件 专注于加密和审计…

漏洞挖掘 SSRF 一次很菜的SSRF低危小通杀

前言 一转眼貌似很长时间都没更新博客了&#xff0c;甚至连标题的大小和格式都有点忘了&#xff0c;今后应该尽量保持每周更新一次&#xff0c;主要是平常上课太忙了&#xff0c;在学校还总是不定时会刷新一些烂事&#xff0c;就耽误了很多时间。这篇文章用于记载我最近的一次…

深入理解MD5算法:原理、应用与安全

title: 深入理解MD5算法&#xff1a;原理、应用与安全 date: 2024/4/11 20:55:57 updated: 2024/4/11 20:55:57 tags: MD5算法数据安全哈希函数摘要算法安全漏洞SHA算法密码学 第一章&#xff1a;引言 导言 在当今数字化时代&#xff0c;数据安全和完整性变得至关重要。消息…

gradio简单搭建——关键词简单筛选【2024-4-11优化】

gradio简单搭建——关键词简单筛选[2024-4-11 优化] 新的思路&#xff1a;标签自动标注界面搭建优化数据处理与生成过程交互界面展示 新的思路&#xff1a;标签自动标注 针对通过关键词&#xff0c;在文本数据中体现出主体的工作类型这一任务&#xff0c;这里使用展示工具grad…

Claude使用教程

claude 3 opus面世后&#xff0c;网上盛传吊打了GPT-4。网上这几天也已经有了许多应用&#xff0c;但竟然还有很多小伙伴不知道国内怎么用gpt&#xff0c;也不知道怎么去用这个据说已经吊打了gpt-4的claude3。 今天我们想要进行的一项尝试就是—— 用claude3和gpt4&#xff0c…

猝不及防 CCF-B ICPP 2024投稿延期至4月22日提交摘要 机会来了别错过

会议之眼 快讯 第53届ICPP&#xff08;International Conference on Parallel Processing&#xff09;即国际并行处理会议将于 2024年 8月12日-15日在瑞典哥特兰岛举行&#xff01;ICPP是世界上最古老的连续举办的并行计算计算机科学会议之一。它是学术界、工业界和政府的研究…

Vue项目页面中快速使用JSON数据格式化模块插件

页面中快速使用JSON数据格式化模块插件 JSON数据格式化模块插件&#xff0c;可以用来展示JSON数据&#xff0c;也可以验证某数据是否为JSON格式 1、可以使用 b-code-editor插件 来实现效果&#xff0c;方便快捷&#xff0c; 安装命令&#xff1a;npm install bin-code-editor…

suno有了新对手udio炸裂音乐圈;又一个开源AI Devin 程序员;完全开源轻量级的文本到语音可生成特定说话者的风格

✨ 1: udio 由音乐和科技界重量级人物支持的强大 AI 音乐生成器&#xff0c;被称为音乐界的另一个 ChatGPT。 Udio 由前 Google DeepMind的研究院和工程师创立&#xff0c;得到了a16z的支持&#xff0c;总部在伦敦和纽约。 目前是一个免费的V1测试版产品&#xff0c;每个人每…

docker完美安装分布式任务调度平台XXL-JOB

分布式任务调度平台XXL-JOB 1、官方文档 自己看 https://www.xuxueli.com/xxl-job/#1.1%20%E6%A6%82%E8%BF%B0 2、使用docker部署 本人使用的腾讯云&#xff0c;安装docker暴露一下端口&#xff0c;就很舒服的安装这个服务了。 docker pull xuxueli/xxl-job-admin:2.4.03…

飞书api增加权限

1&#xff0c;进入飞书开发者后台&#xff1a;飞书开放平台 给应用增加权限 2&#xff0c;进入飞书管理后台 https://fw5slkpbyb3.feishu.cn/admin/appCenter/audit 审核最新发布的版本 如果还是不行&#xff0c;则需要修改数据权限&#xff0c;修改为全部成员可修改。 改完…

KVM+GFS分布式存储

本章内容&#xff1a; 学会KVMGFS分布式存储高可用 1.0 案例环境 1.案例环境 大规模使用 KVM 虚拟机来运行业务&#xff0c;为了保证公司虚拟机能够安全稳定运行&#xff0c; 决定采用 KVMGlusterFS 模式&#xff0c;来保证虚拟机存储的分布部署&#xff0c;以及分布冗余。避…

2024.4.11

1.思维导图 2.指针形式验证大小端存储 #include<myhead.h>int main(int argc, const char *argv[]) {int num 0x12345678;char* ptr (char *)&num;if(*ptr 0x12){printf("big endian\n");}else if(*ptr 0x78){printf("little endian\n");}r…

正则表达式与JSON序列化:去除JavaScript对象中的下划线键名

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

vue源码解析——v-if和v-for哪个优先级高,如何避免两者同时使用

首先&#xff0c;官方不推荐v-if和v-for在同一个元素上使用。其次&#xff0c;如果两者同时使用&#xff0c;v-if和v-for的优先级怎么确定&#xff1f;在vue2和vue3中这两者的优先级顺序不一样。vue2是v-for优先&#xff0c;条件不存在时也会渲染多个注释节点。在vue3中进行了改…

关于01背包和完全背包问题的细节思考

01背包问题 #include<iostream> #include<stdlib.h> #include<vector> #include<cmath> int main() {int M0; //材料数int N0; //背包容量std::cin>>M>>N;std::vector<int>space(M,0);for(int i0;i<M;i) std::cin>>…

Nodejs 第六十二章(短链接)

短链接介绍 短链接是一种缩短长网址的方法&#xff0c;将原始的长网址转换为更短的形式。它通常由一系列的字母、数字和特殊字符组成&#xff0c;比起原始的长网址&#xff0c;短链接更加简洁、易于记忆和分享。 短链接的主要用途之一是在社交媒体平台进行链接分享。由于这些…

Offline RL : Efficient Planning in a Compact Latent Action Space

ICLR 2023 paper Intro 采用Transformer架构的Planning方法对马尔可夫序列重构,(et. TT)在面对高维状态动作空间&#xff0c;容易面对计算复杂度高的问题。本文提出TAP算法&#xff0c;基于Transformer的VQ-VAE&#xff0c;利用提取的状态动作在隐空间的低微特征进行Planning…

表单,表格小练习

表格练习&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document&…

创新指南|战略衡量的增长组织:用人工智能增强关键绩效指标(KPI)

传统的关键绩效指标 (KPI)越来越无法提供领导者取得成功所需的信息和见解。他们在跟踪进展、协调人员和流程、确定资源优先级以及推进问责制方面存在不足。本文是 2024 年第一份麻省理工学院 SMR - BCG 人工智能和商业战略全球高管学习和研究项目的调查结果——人工智能和业务战…

成为 Jira 大师:效率达人的必备秘诀

&#x1f525; 效率达人喜欢使用 Jira 的快捷键和命令面板&#xff0c;因为他们能够在不移动鼠标的情况下&#xff0c;快速执行各种命令和导航操作&#xff0c;从而更有效地完成 Jira 中的常见任务。 &#x1f3d6;️ 通过熟练掌握这些快捷键和命令&#xff0c;效率达人能够更…