Python 操作 MongoDB 详解

嗨害大家好鸭!我是芝士❤

在这里插入图片描述

一、前言

MongoDB属于 NoSQL(非关系型数据库),
是一个基于分布式文件存储的开源数据库系统。

二、操作 MongoDB

1. 安装 pymongo

python 使用第三方库来连接操作 MongoDB,
所以我们首先安装此库。

pip3 install pymongodb

2. 连接 MongoDB

使用 MongoClient 类连接,
以下两种参数方式都可以:

from pymongo import MongoClient

# 连接方式一
client = MongoClient(host='localhost',port=27017)
# 连接方式二
# client = MongoClient('mongodb://localhost:27017/学习资料无偿领扣扣qun:540305994')

3. 选择数据库

MongoDB 可以创建很多 db,
指定我们需要的 db 即可

# 方式一
db = client.Monitor
# 方式二
# db = client['Monitor']

4. 选择集合

db 内包含很多个集合,
有点类似 mysql 这类关系型数据库中的表

# 方式一
collection = db.test
# 方式二
# collection = db['test']

5. 插入数据

插入一条数据,
MongoDB 每条记录都有一个唯一标识。
返回一个 InsertOneResult 对象,
若需要获取唯一标识,
找到 InsertOneResult 对象的属性 inserted_id 即可

from pymongo import MongoClient

class mongodb:
    def __init__(self,host,db,port = 27017):
        '''
        :param host: str mongodb地址
        :param db: str 数据库
        :param port: int 端口,默认为27017
        '''
        host = host
        db = db
        self.port = port
        client = MongoClient(host=host,port=port)
        self.db = client[db]

    def insert_one(self,table,dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 要插入的字典
        :return: 返回一个包含ObjectId类型的对象
        '''
        collection = self.db[table]
        rep = collection.insert_one(dic)

        return rep
if __name__=='__main__':
    dic = {'姓名':'小明','English':100,'math':90}
    db = mongodb(host='localhost',db = 'test')
    rep = db.insert_one('test',dic)
    print(rep.inserted_id)

插入多条数据,使用 insert_many 批量插入

from pymongo import MongoClient

class mongodb:
    def __init__(self,host,db,port = 27017):
        '''
        :param host: str mongodb地址
        :param db: str 数据库
        :param port: int 端口,默认为27017
        '''
        host = host
        db = db
        self.port = port
        client = MongoClient(host=host,port=port)
        self.db = client[db]

    def insert_one(self,table,dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 要插入的字典
        :return: 返回包含一个ObjectId类型的对象
        '''
        collection = self.db[table]
        rep = collection.insert_one(dic)

        return rep

    def insert_many(self,table,lists):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 要插入的列表,列表中的元素为字典
        :return: 返回包含多个ObjectId类型的列表对象
        '''
        collection = self.db[table]
        rep = collection.insert_many(lists)

        return rep


if __name__=='__main__':
    lists = [{'姓名':'小明','English':100,'math':90},
             {'姓名':'小华','English':90,'math':100}]
    db = mongodb(host='localhost',db = 'test')
    rep = db.insert_many('test',lists)
    for i in rep.inserted_ids:
        print(i)

6. 查询

1)常规查询

  • find_one :查询单条记录,返回一个字典。
  • find:查询多条记录 ,返回一个游标对象。
from pymongo import MongoClient

class mongodb:
    def __init__(self,host,db,port = 27017):
        '''
        :param host: str mongodb地址
        :param db: str 数据库
        :param port: int 端口,默认为27017
        '''
        host = host
        db = db
        self.port = port
        client = MongoClient(host=host,port=port)
        self.db = client[db]

    def find_one(self,table,dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: dict 返回单条记录的字典
        '''
        collection = self.db[table]
        rep = collection.find_one(dic)

        return rep

    def find(self,table,dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: list 返回查询到记录的列表
        '''
        collection = self.db[table]
        rep = list(collection.find(dic))

        return rep

if __name__=='__main__':
    # 查询 English 成绩为 100 的所有记录
    dic = {'English':100}
    db = mongodb(host='localhost',db = 'test')
    rep = db.find('test',dic)
    print(rep)

2)范围查询

有时候我们需要范围比较查询,
比如要查询 English 成绩为 80~90 ,
可以使用比较符:dic = {'English':{'$in':[80,90]}}

  • $lt :小于
  • $lte:小于等于
  • $gt:大于
  • $gte:大于等于
  • $ne:不等于
  • $in:在范围内
  • $nin:不在范围内

3)模糊查询

如果想要类似这种 sql 语句查询:
select * from db where name like '%abc%'
在 MongoDB 中可以通过正则表达式来实现

# 模糊搜索key为"姓名",value包含"明"的记录
dic = {'姓名':{'$regex':'明'}}
rep = list(collection.find(dic))

4)字段筛选

如果只想返回指定的字段,使用 find(find_one)方法时加上 projection 参数。类似 sql 语法:select Englist from db where name like ‘%abc%’

# projection字典参数。1显示,0不显示
# 以下查询结果只返回key为English的相关字段
rep = list(collection.find(dic,projection={'English':1,'_id':0}))

5)计数

直接调用 count() 方法,返回一个 int 类型的数字

# 计数查询只需要在普通查询后加上 count() 即可
count = collection.find().count()  
# count = collection.find({'English':{'$gt':90}}).count()

6)排序

排序时,直接调用sort()方法,并在其中传入排序的字段及升降序标志,返回一个游标对象

# 正序 ASCENDING,倒序 DESCENDING。list()将游标对象转成列表
data = list(collection.find(dic).sort('姓名',pymongo.DESCENDING))

7. 更新数据

首选查到需要更新的数据,然后将该数据更新,返回一个 UpdataResult 对象, raw_result 属性中包含 update 生效的个数。

  • update_one:更新查询到的第一条数据
  • update_many:更新多条数据
from pymongo import MongoClient

class mongodb:
    def __init__(self,host,db,port = 27017):
        '''
        :param host: str mongodb地址
        :param db: str 数据库
        :param port: int 端口,默认为27017
        '''
        host = host
        db = db
        self.port = port
        client = MongoClient(host=host,port=port)
        self.db = client[db]

    def update_one(self,table,condition,dic):
        '''
        :param table: str 数据库中的集合
        :param condition: dict 查询条件
        :param dic: dict 更新的数据
        :return: 返回UpdateResult对象
        '''
        collection = self.db[table]
        # $set 表示只更新dic字典内存在的字段
        rep = collection.update_one(condition,{'$set':dic})
        # 会把之前的数据全部用dic字典替换,如果原本存在其他字段,则会被删除
        # rep = collection.update_one(condition, dic)

        return rep

    def update_many(self,table,condition,dic):
        '''
        :param table: str 数据库中的集合
        :param condition: dict 查询条件
        :param dic: dict 更新的数据
        :return:返回UpdateResult对象
        '''
        collection = self.db[table]
        # $set 表示只更新dic字典内存在的字段
        rep = collection.update_many(condition,{'$set':dic})
        # 会把之前的数据全部用dic字典替换,如果原本存在其他字段,则会被删除
        # rep = collection.update_many(condition, dic)

        return rep


if __name__=='__main__':
    condition = {'English':80}
    dic = {'English':60}
    db = mongodb(host='mongodb-monitor.monitor.svc.test.local',db = 'test')
    rep = db.update_one('test',condition,dic)
    print(rep.raw_result)

    # 输出 {'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}

8. 删除

删除和 update 类似,删除数据后,返回一个 DeleteResult 对象, raw_result 属性中包含 delete 的个数

  • delete_one:删除查询到的第一条数据
  • delete_many:批量删除符合查询条件的数据
from pymongo import MongoClient

class mongodb:
    def __init__(self,host,db,port = 27017):
        '''
        :param host: str mongodb地址
        :param db: str 数据库
        :param port: int 端口,默认为27017
        '''
        host = host
        db = db
        self.port = port
        client = MongoClient(host=host,port=port)
        self.db = client[db]

    def delete_one(self,table,dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: 返回DeleteResult对象
        '''
        collection = self.db[table]
        rep = collection.delete_one(dic)

        return rep

    def delete_many(self,table,dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: 返回DeleteResult对象
        '''
        collection = self.db[table]
        rep = collection.delete_many(dic)

        return rep


if __name__=='__main__':
    dic = {'English':60}
    db = mongodb(host='localhost',db = 'test')
    rep = db.delete_many('test',dic)
    print(rep.raw_result)
    # 输出 {'n': 21, 'ok': 1.0}

今天的文章就是这样~

我们下篇文章再见啦(✿◡‿◡)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis的SDS、intSet、Dict、ZipList、QuickList、RedisObject及五种数据结构详解

动态字符串 我们都知道Redis中保存的key是字符串,value 往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构 不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题: 1.获取字符串长度需要进行计算 2.…

网络安全之入侵检测

目录 网络安全之入侵检测 入侵检测经典理论 经典检测模型 入侵检测作用与原理 意义 异常检测模型(Anomaly Detection) 误用检测模型(Misuse Detection) 经典特征案例 ​编辑自定义签名 ​编辑 签名检查过程 检测生命周期…

http请求类RestTemplate

RestTemplate类1.1 初识RestTemplate1.2 注入方式1.3 常用方法1.1 初识RestTemplate RestTemplate类是一个用于发送HTTP请求并获取HTTP响应的模板类。它可以被用于执行GET,POST,PUT,DELETE等各种HTTP方法,同时还支持处理请求参数…

微信小程序python+vue今日菜谱美食点赞收藏评价系统

谈到外出就餐,我们除了怕排队,也怕这家餐厅的服务员不够用,没人为我们点餐,那么一餐饭排队一小时,点餐恐怕也要花个半小时,这样不仅给消费者的用餐体验大打折扣同时也给商家的口碑造成了严重负面的影响&…

KD-2125地下电缆测试仪

一、产品概述 管线探测仪是一套高性能地下金属管线探测系统,由信号发射机和接收机组成,可用于金属管线、地下电缆的路径探测、管线普查和深度测量,配合多种选配附件,可以进行唯一性鉴别,以及管道绝缘破损和部分类型电缆…

在Win10安装pytorch3d

Pytorch3d 这是一个为使用Pytorch的3D计算机视觉研究提供的高效可重用的组件 主要特点包括: 用于储存和操作三角形网格的数据结构三角形网格的高效操作(投影变换、图形卷积、采样、损失函数)可区分的网格渲染器可以通过隐式函数进行新试图…

Object.defineProperty()和 Proxy的区别

众所周知,Object.defineProperty()和 Proxy的区别也是Vue2和Vue3响应式的区别,现在就聊一下为什么Proxy会替代Object.defineProperty() Object.defineProperty(): Object.defineProperty() 方法会直接在一个对象上定义一个新属性&#xff0…

字节8年测试经验,送给想要学习自动化测试的同学6条建议

我的职业生涯开始和大多数测试人一样,开始接触都是纯功能界面测试。那时候在一家电商公司做测试,做了有一段时间,熟悉产品的业务流程以及熟练测试工作流程规范之后,效率提高了,工作比较轻松,也得到了更好的…

MyBatisPlus-DQL编程控制

MyBatisPlus-DQL编程控制3,DQL编程控制3.1 条件查询3.1.1 条件查询的类3.1.2 环境构建3.1.3 构建条件查询3.1.4 多条件构建3.1.5 null判定3.2 查询投影3.2.1 查询指定字段3.2.2 聚合查询3.2.3 分组查询3.3 查询条件3.3.1 等值查询3.3.2 范围查询3.3.3 模糊查询3.3.4…

堆来咯!!!

堆是什么? 是土堆吗? 那当然不是啦~ 堆是一种被看作完全二叉树的数组。 那么什么是完全二叉树呢? 如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。 堆的特…

中国版的ChatGPT,你最看好谁?

一、百度:文心一言升级中,未来支持开源 3月16日,百度正式推出国内首款生成式AI产品“文心一言”,可支持文学创作、文案创作、数理推算、多模态生成等功能。 “文心一言”基于全栈自研的AI基础设施进行学习和训练: ①…

selenium自动化测试面试题【含答案】

目录 1、selenium中如何判断元素是否存在? 2、selenium中hidden或者是display = none的元素是否可以定位到? 3、selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以点击的? 4、如何提高s…

redis持久化方式区别

Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序…

springboot实现修改用户信息功能

目录 1、UserEntity层 2、UserMapper层 3、UserService层 4、UserController类 5、Postman测试 要实现修改用户信息的功能,需要编写对应的代码: 如: 在UserEntity中定义用户实体类的属性。 在UserMapper中编写修改用户的SQL语句&#…

极光笔记 | 如何在Shopify中使用EngageLab (下)

Sendgird发布的《2022 Global Messaging Engagement Report》中揭示了世界各地的用户更喜欢用哪种方式与品牌互动,结论是:“电子邮件仍然是第一名(短信紧随其后)”。4800多名受访者中,有18%的人将电子邮件列为他们最常…

批处理文件名(不含空格的文件名、以及含空格的文件名)

目的: 整理为: 步骤: 结果生成1.txt内容为: 新建excel 复制1.txt中待处理的文件名字 然后 一直点下一步直到完成,再删除多余列,只剩下名字列 设置P1单元格为1.jpg,下拉递增 设置P1单元格 “REN “&…

Html5代码实现动态时钟

以下是一个简单的HTML5动态时钟的示例&#xff1a; <!DOCTYPE html> <html> <head><title>HTML5动态时钟</title><style>body {margin: 0;padding: 0;background-color: #000;color: #fff;font-size: 5em;font-family: Arial, sans-serif…

1、Windows下编译并搭建AzerothCore服务端

目录前言一、AzerothCore下载二、mysql安装三、boost安装四、OpenSSL安装五、CMake下载六、CMake编译1 - CMake生成vs项目2 - vs项目设置3 - 生成解决方案4 - 安装AzerothCore5 - 添加账号6 - 修改服务器名称7 - 修改客户端的服务器地址前言 客户端对应版本&#xff1a;魔兽世…

STM32 PWM模式与输出比较模式的区别。PWM占空比不生效,在STM32CubeMX中配置PWM的两种模式——蓝桥杯嵌入式

&#x1f38a;【蓝桥杯嵌入式】专题正在持续更新中&#xff0c;原理图解析✨&#xff0c;各模块分析✨以及历年真题讲解✨都已更新完毕&#xff0c;欢迎大家前往订阅本专题&#x1f38f; &#x1f38f;【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 &#x1f38f;【蓝桥杯嵌入式】蓝桥…

chatgpt入口-chatgpt哪里下载

如何开通ChatGPT权限 开通 ChatGPT 的权限与具体的服务提供商有关&#xff0c;不同的服务提供商可能有不同的服务要求和使用条件。下面是一些可以开通 ChatGPT 权限的一般步骤&#xff1a; 寻找服务提供商&#xff1a;首先需要寻找一个可供使用的 ChatGPT 服务提供商。您可以在…