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% 以上,支持题目在线…

微信小程序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,查询全体学生的姓名&#…

安装好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 &…

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;通过测试来推…

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…

Sleuth(Micrometer) +ZipKin分布式链路追踪的解析以及使用

1、用另一种场景来类比Sleuth和Zipkin的作用 我们来设想一个快递公司的物流追踪系统。设你在网上购买了一本书&#xff0c;当你的订单提交后&#xff0c;后台系统会生成一个唯一的订单号&#xff0c;这个订单号就相当于Sleuth中的Trace ID。你的订单会经过几个主要的处理阶段&…

3.5 查找和排序算法

大纲 算法基础 常用的表示算法的方法 算法的复杂度 查找 顺序查找、二分查找 哈希查找 真题 排序 插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 排序算法总结

黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day4 重置版 全网最全最快

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我会…

UniCAVE实现融合输出或多屏输出

介绍 CAVE沉浸式系统包含单主机多屏和多主机多屏两种系统架构。此文档主要介绍融合输出与单机多屏输出&#xff0c;这两种方式都属于单主机多屏。均以使用UniCAVE输出到前左右下为例。引用的Package为UniCAVE2019。 融合输出 实现原理 &#xff08;猜测&#xff09;是将多块…

2024春秋杯网络安全联赛夏季赛Crypto(AK)解题思路及用到的软件

2024春秋杯网络安全联赛夏季赛Crypto(AK) 2024春秋杯网络安全联赛夏季赛Crypto解题思路以及用到的软件 所有题用到的软件 1.vm(虚拟机kali)和Ubuntu&#xff0c;正常配置即可B站有很多。 2.Visual Studio Code(里面要配置python&#xff0c;crypto库和Sagemath数学软件系统S…

基于微信小程序+SpringBoot+Vue的青少年科普教学系统平台(带1w+文档)

基于微信小程序SpringBootVue的青少年科普教学系统平台(带1w文档) 基于微信小程序SpringBootVue的青少年科普教学系统平台(带1w文档) 这个工具就是解决上述问题的最好的解决方案。它不仅可以实时完成信息处理&#xff0c;还缩短高校教师成果信息管理流程&#xff0c;使其系统化…

LINUX之MMC子系统分析

目录 1. 概念1.1 MMC卡1.2 SD卡1.3 SDIO 2. 总线协议2.1 协议2.2 一般协议2.3 写数据2.4 读数据2.5 卡模式2.5.1 SD卡模式2.5.2 eMMC模式 2.6 命令2.6.1 命令类2.6.2 详细命令 2.7 应答2.8 寄存器2.8.1 OCR2.8.2 CID2.8.3 CSD2.8.4 RCA2.8.5 扩展CSD 3. 关键结构3.1 struct sdh…

数学建模(7)——Logistic模型

一、马尔萨斯人口模型 import numpy as np import matplotlib.pyplot as plt# 初始人口 N0 100 # 人口增长率 r 0.02 # 时间段&#xff08;年&#xff09; t np.linspace(0, 200, 200)# 马尔萨斯人口模型 N N0 * np.exp(r * t)# 绘图 plt.plot(t, N, labelPopulation) plt.…

【数据结构】堆的实现以及建堆算法和堆排序

【数据结构】堆的实现以及建堆算法和堆排序 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;数据结构 文章目录 【数据结构】堆的实现以及建堆算法和堆排序前言一.堆的实现1.1 堆数据的插入1.2堆数据的删除 二.建堆算法和堆排序2.1思路分析2.…