MongoDB 文档存储

安装

下载: Download MongoDB Community Server | MongoDB

 说明: 现在基本都安装的是4.4以后的版本。安装完成后使用 mongod 来查看是否安装成功

 会输出一堆内容

而如果想要操作数据库,则需要安装一个工具,mongosh-2.2.12-x64.msi

地址: Try MongoDB Tools - Download Free Here | MongoDB

如果 这个shell 不安装,目前输入 mongo 会提示不是内部或外部命令

我这里没有安装,因为我使用的是 pymongo 来操作数据库暂时搁置

我这里使用的是图形化界面

 打开后直接点击连接即可

下载地址: Try MongoDB Tools - Download Free Here | MongoDB

安装到和 MongoDB 同一个目录即可

 安装 pymongo

pip install pymongo

连接 MongoDB

连接 MongoDB 时,需要使用PyMongo 库里的MongoClient 方法, 一般而言, 传入 MongoDB 的IP及端口号即可。 MongoClient 方法的第一个参数为地址 host , 第二个参数为端口 port (如果不传入此参数,默认为 27017)

import pymongo 

client = pymongo.MongoClient(host='localhost', port= 27017)

这样就可以创建 MongoDB 的连接对象了

另外还可以直接给 MongoClient 的第一个参数 host 传入 MongoDB 的连接字符串, 它以 mongodb 开头

client = MongoClient('mongodb://loaclhost:270717/')

这可以达到同样的效果

指定数据库

在 MongoDB 中,可以建立多个数据库, 所以我们需要指定操作哪个数据库。这里我们以指定 test数据库为例

db = client.test

也可以

db = client['test']

效果等价

指定合集

MongoDB 的每个数据库又都包含许多集合(collection) , 这些集合类似于关系型数据库中的表。

这里指定一个集合,名称为 students 

collection = db.students

或者

collection = db['students']

插入数据

在students 中插入一条数据数据

这里有的老版会看到使用的是 insert  这个方法已经弃用了

result = collection.insert_one(student)
print(result)

InsertOneResult(ObjectId('669f7a2f7892de6a90c80867'), acknowledged=True)

 

插入多条数据

student1 = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}

student2 = {
    'id': '20170202',
    'name': 'Mike',
    'age': 21,
    'gender': 'male'
}
result = collection.insert_many([student1,student2])
print(result)

InsertManyResult([ObjectId('669f7a967892de6a90c80868'), ObjectId('669f7a967892de6a90c80869')], acknowledged=True)

对于单个数据可以使用 inserted_id 来获取单个 ID 如果是多个则需要使用 inserted_ids 来获取

print(result.inserted_ids)

[ObjectId('669f7a967892de6a90c80868'), ObjectId('669f7a967892de6a90c80869')]

查询

我们可以利用 find_one 和 find 来查询数据,前者是查询单个结果,后者则会返回一个生成器对象

result = collection.find_one({'name': 'Mike'})
print(type(result))
print(result)

<class 'dict'>
{'_id': ObjectId('669f7a967892de6a90c80869'), 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'}

可以发现是字典类型,它多了 _id 属性, 这就是 MongoDB 在插入过程中自动添加的

此外我们也可以根据 ObjectId 来查询数据, 此时需要使用 bson 库里的 objectid 

from bson.objectid import ObjectId
result = collection.find_one({'_id': ObjectId('669f7a967892de6a90c80869')})
print(result)

{'_id': ObjectId('669f7a967892de6a90c80869'), 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'}

其结果依然是字典类型, 里面的  669f7a967892de6a90c80869 是前面复制的

如果查询结果不存在,则会返回 None

如果要查询多条数据,可以用 find 方法

results = collection.find({'age': 20})
print(results)
for result in results:
    print(result)

<pymongo.cursor.Cursor object at 0x000001DEE1293050>
{'_id': ObjectId('669f79bd7892de6a90c80865'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('669f7a2f7892de6a90c80867'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('669f7a967892de6a90c80868'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}

返回结果是 Cursor 类型,相当于一个生成器, 通过遍历能过获取所有结果,其每个结果都是字典类型

如果要查询 age 大于20 的数据

results = collection.find({'age': {'$ge':20}})

这里查询的键值已经不是单纯的数字了,而是一个字典, 其键名为比较符号 $gt 意思是大于

键值为 20 

这里列出一些符号

符号含义实例
$lt小于{’age' : {'$lt': 20}}
$gt大于{’age' : {'$gt': 20}}
$lte小于等于{’age' : {'$lte': 20}}
$gte大于等于{’age' : {'$gte': 20}}
$ne不等于{’age' : {'$ne': 20}}
$in在范围内{’age' : {'$in': [20, 23]}}
$nin不在范围内{’age' : {'$nin': [20, 23]}}

另外还可以执行正则匹配查询

result = collection.find({'name': {'$regex': '^M.*'}})

这里使用 $regex 来指定正则匹配, ^M.*  代表 以 M 开头的正则表达式

下面是一些功能符号

符号含义实例实例含义
$regex匹配正则表达式{'name': {'$regex': '^M.*'}} name 以M为开头
$exists属性是否存在{'name': {'$exists': True}}存在name 属性
$ype类型判断{'age': {'$type': 'int' }}age 的 类型为 int
$mod数字模操作{'age': {'$mod':[5, 0] }}age 模 5 余 0
$text文本查询{'$text': {'$search': 'Mike' }}text类型的属性中包含 Mike 字符串
$where高级条件查询{'$where' : 'obj.fans_count == obj.follows_count'}自身粉丝数等于关注数

计数

要统计查询结果包含多少条数据

以前版本的 count 方法已经弃用

count = collection.estimated_document_count()
print(count)

如果要带条件查询

count = collection.count_documents({'age': 20})
print(count)

排序

排序时 调用 sort 方法

results = collection.find().sort('name', pymongo.ASCENDING)
print([result['name'] for result in results])

['Jordan', 'Jordan', 'Jordan', 'Mike']

偏移

某些情况下,我们可能只需要其中的某几个元素,这个时候可以用 skip 方法设置偏移几个位置

results = collection.find().sort('name', pymongo.ASCENDING).skip(2)
print([result['name'] for result in results])

['Jordan', 'Mike']

另外还可以使用 limit 方法指定获取的元素个数

results = collection.find().sort('name', pymongo.ASCENDING).limit(2)
print([result['name'] for result in results])

['Jordan', 'Jordan']

如果不使用 limit 方法加以限制,原本会返回 4 个结果, 而加了限制之后会返回 2 两个结果

值得注意的时, 在数据库中数据量非常庞大的时候, 最好不要使用大偏移量来查询数据,因为这样可能会导致内存溢出。可以使用如下方法

from bson.objectid import ObjectId
collection.find({'_id' :{'$ge': {ObjectId('669f79bd7892de6a90c80865')}}})

这里需要记录之前的 ID

更新

对于数据更新可以使用  update_one 修改一条数据,update_many 修改多条数据

condition = {'name': 'Kevin'}
student = collection.find_one(condition)
newstudent = {"$set" : {"age": 25}}
result = collection.update_one(condition, newstudent)
print(result)

UpdateResult({'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}, acknowledged=True)

这里我们更新的是 name 值为 Mike的学生数据的 age , 首先指定查询条件, 然后将数据查询出来,修改其 age 后调用 update_one 方法将原本条件和修改后的数据传入

返回结果是字典形式, ok 代表执行成功, nModified 代表影响的数据条数

修改多条数据

condition = {'age': {'$gt': 20}}
result = collection.update_many(condition, {'$inc': {'age': 1}})
print(result)
print(result.matched_count, result.modified_count)

 

UpdateResult({'n': 2, 'nModified': 2, 'ok': 1.0, 'updatedExisting': True}, acknowledged=True)
2 2

删除

删除 使用 delete_one() 删除一条, delete_many() 删除多条

result = collection.delete_one({'name': 'Kevin'})
print(result)

DeleteResult({'n': 1, 'ok': 1.0}, acknowledged=True)

delete_many() 删除多条

result = collection.delete_many({'age': {'$lt': 25}})
print(result.deleted_count)

2

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

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

相关文章

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 堆内存申请(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

linux(CentOS、Ubuntu)安装python3.12.2环境

1.下载官网Python安装包 wget https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz 1.1解压 tar -xf Python-3.12.2.tar.xz 解压完后切换到Python-3.12.2文件夹(这里根据自己解压的文件夹路径) cd /usr/packages/Python-3.12.2/ 1.2升级软件包管理器 CentOS系…

微信小程序canvas 使用案例(一)

一、cavans 对象获取、上线文创建 1.wxml <!-- canvas.wxml --><canvas type"2d" id"myCanvas"></canvas> 2.js /*** 生命周期函数--监听页面加载*/onLoad(options) {const query wx.createSelectorQuery()query.select(#myCanvas).f…

mysql练习3

1.修改student 表中年龄(sage)字段属性&#xff0c;数据类型由int 改变为smallint 2.为Course表中Cno 课程号字段设置索引,并查看索引 3.为SC表建立按学号(sno)和课程号(cno)组合的升序的主键索引&#xff0c;索引名为SC_INDEX 4.创建一视图 stu info,查询全体学生的姓名&#…

IDEA的APIPost接口测试插件详解

APIPOST官方网址 一、安装APIPost插件 打开IntelliJ IDEA&#xff1a; 启动您的IntelliJ IDEA开发环境。 导航到插件设置&#xff1a; 在Windows或Linux上&#xff0c;点击 File > Settings。在macOS上&#xff0c;点击 IntelliJ IDEA > Preferences。 搜索并安装APIPo…

前端:上传2进制图片

1、let formData new FormData(); 2、添加要传的字段&#xff1a;formData.append("avatarfile", data); &#xff08;key,value&#xff09; 3、上传文件 function uploadImg() {// 1定义FormDatalet formData new FormData();// 2添加字段formData.append("…

安装好anaconda,打开jupyter notebook,新建 报500错

解决办法&#xff1a; 打开anaconda prompt 输入 jupyter --version 重新进入jupyter notebook&#xff1a; 可以成功进入进行代码编辑

建筑工程企业项目管理系统哪个好?试试企智汇工程项目管理系统

在建筑工程行业中&#xff0c;项目管理的复杂性和挑战性是众所周知的。随着项目规模的扩大和技术的不断进步&#xff0c;传统的管理方法已经难以满足现代建筑工程的需求。企智汇工程项目管理系统应运而生&#xff0c;为建筑工程企业提供了一个全面、智能、高效的解决方案。 一…

[mmdetection]Faster-RCNN模型断点训练方法

断电等问题时常发生&#xff0c;因此我们会对模型进行断点训练。 如mmdetection项目中的FasterRCNN模型训练时出现训练突然中断&#xff0c;我们将使用如下命令从中断的epochs继续训练。 首先我们来看看模型训练时会生成的的文件&#xff1a; 接下来我们将使用如下命令进行断…

【深大计算机系统(2)】实验一 实验环境配置与使用 附常用指令

目录 一、 实验目标&#xff1a; 二、实验环境与工件&#xff1a; 三、实验内容与步骤 1. 学习并熟悉Linux基本操作&#xff0c;按照要求创建用户。&#xff08;30分&#xff09; 2.新建用户主目录下创建子目录&#xff1a;gdbdebug&#xff0c;并进入gdbdebug子目录。将过程和…

Golang | Leetcode Golang题解之第241题为运算表达式设计优先级

题目&#xff1a; 题解&#xff1a; const addition, subtraction, multiplication -1, -2, -3func diffWaysToCompute(expression string) []int {ops : []int{}for i, n : 0, len(expression); i < n; {if unicode.IsDigit(rune(expression[i])) {x : 0for ; i < n &…

C语言——详解结构体内字符型数据定义与初始化

在C语言中&#xff0c;结构体内的字符型数据可以通过多种方式进行定义&#xff0c;并且每种定义方式都有其对应的初始化方法。这些定义方式包括直接定义字符数组、使用字符指针以及结合结构体的不同定义风格。理解这些定义方式及其初始化方法对于编写高效、可维护的C语言程序至…

leetcode日记(47)螺旋矩阵Ⅱ

这题思路不难&#xff0c;就是找规律太难了。 我首先的思路是一行一行来&#xff0c;根据规律填入下一行的数组&#xff0c;第i行是由前i个数字&#xff08;n-2*i&#xff09;个增序数列后i个数字组成&#xff0c;后来觉得太难找规律了就换了一种思路。 思路大致是先计算出需…

googleTest 源码主线框架性分析

TDD&#xff0c;测试驱动开发&#xff0c;英文全称Test-Driven Development&#xff0c;简称TDD&#xff0c;是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码&#xff0c;然后只编写使测试通过的功能代码&#xff0c;通过测试来推…

Apache Commons技术详解

文章目录 简介官网链接原理基础使用Commons LangCommons Collections 高级使用Commons IOCommons Math 优缺点优点缺点 总结 简介 Apache Commons 是 Apache 软件基金会下的一个项目&#xff0c;旨在提供可重用的Java组件。这些组件覆盖了广泛的编程任务&#xff0c;从字符串处…

Vue路由守卫详解及其应用场景分析

随着前端技术的不断发展,vue作为一款开发框架也越来越受到开发者们的欢迎。而vue的路由机制也是vue框架中不可或缺的一部分。路由系统能够帮助开发人员构建复杂的单页应用,同时也提供了一种灵活的方式来管理页面状态和用户导航。在这种情况下,vue路由守卫便成为一个必须要掌…

《刚毕业的计算机大学生如何找到满意工作》

《刚毕业的计算机大学生如何找到满意工作》 对于刚刚毕业的计算机专业大学生来说&#xff0c;踏入职场、找到一份满意的工作是人生的一个重要转折点。然而&#xff0c;在竞争激烈的就业市场中&#xff0c;如何才能脱颖而出&#xff0c;实现自己的职业目标呢&#xff1f;以下是…

如何看待LabVIEW数据清洗的重要性?

数据清洗&#xff0c;即对原始数据进行预处理和整理&#xff0c;是数据分析过程中必不可少的一步。它的主要目的是提高数据的质量&#xff0c;确保后续数据分析和处理的准确性和可靠性。在使用LabVIEW进行数据采集和分析时&#xff0c;数据清洗的重要性体现在以下几个方面&…

React——useEffect和自定义useUpdateEffect

useEffect 是React的一个内置Hook&#xff0c;用于在组件渲染后执行副作用&#xff08;例如数据获取、订阅或手动更改DOM&#xff09;。它将在第一次渲染后和每次更新后都会执行。 useEffect(() > {// 这里的代码将在组件挂载和更新时执行。 }, [dependencies]); // depend…

go语言day16 runtime包 临界资源 sync包

深入理解Java虚拟机到底是什么_java虚拟机是什么-CSDN博客 Golang-100-Days/Day16-20(Go语言基础进阶)/day17_Go语言并发Goroutine.md at master rubyhan1314/Golang-100-Days GitHub runtime 类似jvm&#xff0c;runtime包也提供了垃圾回收功能&#xff0c;不同的是runtime…