MongoDB 文档存储

news2024/11/15 10:37:22

安装

下载: 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.coloradmin.cn/o/1943388.html

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

相关文章

JavaSE从零开始到精通(七) - Stream流

1. 概述 Java 8引入了Stream API&#xff0c;它提供了一种高效且易于使用的处理集合数据的方式。Stream流可以被认为是一种高级的迭代器&#xff0c;允许我们在集合上进行复杂的操作&#xff0c;例如过滤、映射、排序、归约等&#xff0c;而这些操作可以链式调用&#xff0c;形…

C# 开发监控方法执行耗时

MethodTimer.Fody 是一个功能强大的库,可以用于测量 .NET 应用程序中的方法的执行时间。允许你在不修改代码的情况下,自动地测量和记录方法的执行时间。 这个工具是基于.NET的 weaving 技术,通过修改IL(Intermediate Language,中间语言)代码来插入计时逻辑,从而在方法调…

Python内存管理:引用计数与垃圾回收

✨ 内容&#xff1a; 在Python中&#xff0c;内存管理是一个重要且常常被忽视的话题。了解Python如何管理内存&#xff0c;不仅能帮助我们编写高效的代码&#xff0c;还能避免潜在的内存泄漏问题。今天&#xff0c;我们将通过一个实际案例&#xff0c;深入探讨Python的内存管理…

MIT6.824(6.5840) Lab1笔记+源码

文章目录 其他人的内容&#xff0c;笔记写的更好&#xff0c;思路可以去看他们的MapReduceworkermapreduce coordinatorrpc纠错 源码worker.gocoordinator.gorpc.go 原本有可借鉴的部分 mrsequential.go&#xff0c;多看几遍源码 其他人的内容&#xff0c;笔记写的更好&#xf…

如何实现ORACLE19c 安装包DIY

最近一直忙&#xff0c;本想每周有更新的&#xff0c;但老板一句话&#xff0c;就得去干活&#xff0c;想实现这个愿望&#xff0c;看来真的很难&#xff0c;做一天好人容易&#xff0c;要一辈子做好人&#xff0c;难。所以&#xff0c;看到德哥&#xff0c;尹总监&#xff0c;…

言语理解与表达

** 言语理解与表达 1.逻辑填空 2.语句表达 3.阅读理解

MTK 安卓14 launcher3修改桌面模式,替换某些应用图标,以及定制化Hotseat

原生的launcher的Hotseat如下图(1)所示,我想把效果改成图(2) 图(1) 图(2) 一:定制化HotSeat 修改的类&#xff1a;packages/apps/Launcher3/com/android/launcher3/Hotseat.java &#xff08;1&#xff09;.修改hotseat的宽 Hotseat------->setInsetsOverridepublic void…

Java 22 中的4个永久特性

功能处于孵化或预览阶段是什么意思&#xff1f; 实际上&#xff0c;这是向 Java 编程语言添加新功能的新过程&#xff0c;Java 社区使用这种过程来在 API 和工具处于早期实验阶段时从社区获得反馈&#xff08;孵化功能&#xff09;或已经完全指定但尚未永久的阶段&#xff08;…

ConstraintLayout属性说明

ayout_constraintTop_toTopOf&#xff1a;将某一控件的顶部与另一控件的顶部对齐。 layout_constraintTop_toBottomOf&#xff1a;将某一控件的顶部与另一控件的底部对齐。 layout_constraintBottom_toTopOf&#xff1a;将某一控件的底部与另一控件的顶部对齐。 layout_cons…

3GPP R18 Multi-USIM是怎么回事?(四)

前几篇主要是MUSIM feature NAS 部分内容的总结,这篇开始看RRC部分相关的内容,由于RRC部分内容过长,也分成了2篇。这篇就着重看下musim gap以及RRC触发UE离开RRC Connected mode相关的内容,直入正题, 上面的内容在overview中有提到,对应的是如下38.300中的描述。 处于网络…

【Node.js基础02】fs、path模块

目录 一&#xff1a;fs模块-读写文件 1 加载fs模块对象 2 读制定文件内容文件 3 向文件中写入内容 二&#xff1a;path模块-路径处理 1 问题引入 2 __dirname内置变量 使用方法 一&#xff1a;fs模块-读写文件 fs模块封装了与本机文件系统交互方法和属性 1 加载fs模块…

Win11 改造

记录一些安装 win11 系统之后&#xff0c;对使用不习惯的地方&#xff0c;进行的个人改造 右键菜单 Hiyoung006/Win11Useable: 将Win11右键菜单及资源管理器恢复为Win10样式的脚本 切换到旧版右键菜单&#xff1a; reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34…

Chapter18 基于物理的渲染——Shader入门精要学习

Chapter18 基于物理的渲染 一、PBS理论和数学基础1.光是什么微表面模型 2.渲染方程3.精确光源4.双向反射分布函数 BRDF5.漫反射项&#xff08;Lambert 模型&#xff09;Lambertian BRDF为&#xff1a;Disney BRDF中漫反射项 6.高光反射项微面元理论BRDF的高光反射项①菲涅尔反射…

LabVIEW和IQ测试仪进行WiFi测试

介绍一个使用LabVIEW和LitePoint IQxel-MW IQ测试仪进行WiFi测试的系统。包括具体的硬件型号、如何实现通讯、开发中需要注意的事项以及实现的功能。 使用的硬件​ IQ测试仪型号: LitePoint IQxel-MW 电脑: 配置高效的台式机或笔记本电脑 路由器: 支持802.11ax (Wi-Fi 6) 的…

便携气象站:科技助力气象观测

在科技飞速发展的今天&#xff0c;便携气象站以其轻便、高效、全面的特点&#xff0c;正逐渐改变着气象观测的传统模式。这款小巧而强大的设备&#xff0c;不仅为气象学研究和气象灾害预警提供了有力支持&#xff0c;更为户外活动、农业生产等领域带来了诸多便利。 便携气象站是…

遗传算法模型Python代码——用Python实现遗传算法案例

一、遗传算法概述 1.1适用范围 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是一种启发式搜索算法&#xff0c;广泛应用于以下领域&#xff1a; 优化问题&#xff1a;如函数优化、路径规划、资源分配等。机器学习&#xff1a;用于特征选择、超参数优化等。经济与…

服务器系统盘存储不够,添加数据盘并挂载(阿里云)

目录 1.获取数据盘设备名称 2.为数据盘创建分区 3.为分区创建文件系统 4.配置开机自动挂载分区 阿里云数据盘挂载说明链接&#xff1a;在Linux系统中初始化小于等于2 TiB的数据盘_云服务器 ECS(ECS)-阿里云帮助中心 1.获取数据盘设备名称 sudo fdisk -lu 运行结果如下所示…

解决 elementUI 组件在 WebStorm 中显示为未知标签的问题

解决 elementUI 组件在 WebStorm 中显示为未知标签的问题 一、问题 自从转到 ts 之后&#xff0c;编辑器就一直提示用到的 elementUI 标签未知&#xff0c;一直显示一溜黄色警示&#xff0c;很烦&#xff1a; 二、解决 把它改成大写就可以了。 如下&#xff1a; 把整个项目…

【C++】学习笔记——哈希_2

文章目录 十八、哈希3. 实现哈希表哈希表的存储节点哈希函数哈希表的定义哈希表的插入哈希表的查找哈希表的删除测试函数完整代码结果 未完待续 十八、哈希 3. 实现哈希表 哈希表的实现方法有蛮多种&#xff0c;这里我们选一个比较经典的开散列法来实现哈希表。由于STL库里的…

使用PicGo操作gitee图床(及web端html不能访问图片的解决办法)

1.新建仓库 2.输入仓库名称,也就是图床名称,必须设置开源可见 也可以在创建仓库后,点击管理->基本信息->是否开源进行设置 鼠标悬浮到右上角头像->设置 点击私人令牌 点击生成新令牌,填写描述,直接点提交即可 点击提交后输入登录密码会生成一个token秘钥,如下,这个…