余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

Python操作MongoDB数据库(一)

xiyangw 2023-05-13 16:21 14 浏览 0 评论

前言

干货文章继续出发!隔的时间有些久了哈,对 MongoDB 安装回顾的同学,可以看下windows环境 《初识 MongoDB 数据库》。这篇文章结尾处,介绍到使用图形化界面来创建了 MongoDB 的库,表,以及数据。

今天这篇文章,来带你来玩一玩,如何使用 Python 操作 MongoDB 数据库。

Python操作MongoDB数据库(一)

MongoDB基础概念

为了有一个良好的学习体验,再操作之前简单的理解下 MongoDB 的基础数据类型会有极大的帮助。



  • MongoDB将数据存储在灵活的,类似JSON的文档中,这意味着字段可能因文档而异,并且数据结构可以随时间变化
  • 文档模型映射到应用程序代码中的对象,使数据易于使用
  • 即席查询,索引和实时聚合提供了访问和分析数据的强大方法
  • MongoDB是一个分布式数据库,因此内置了高可用性,水平扩展和地理分布,并且易于使用
  • MongoDB可以免费使用。2018年10月16日之前发布的版本根据AGPL发布。2018年10月16日之后发布的所有版本(包括先前版本的修补程序)都在服务器端公共许可证(SSPL)v1下发布。

这段官方中文,是我从官网上机翻的,大家简单看下就好。顺便贴了下原版,因为技术性文章看原版是最好的!

如果了解关系型数据库(如MySQL等)的同学,那么其实学习起 MongoDB 也是非常容易理解的,理解层次上的抽象,便是学习的最快方式,我们呢,可以对比下这两种数据库的区别,一看便知!



怎么样,抽象与关系型数据库一对比,理解是否容易很多呢?

Python操作MongoDB

1. 安装 pymongo

首先要借助第三方库 pymongo ,所以安装:

pip install pymongo

2. py 测试连接数据库



import pymongo 
client = pymongo.MongoClient(host='127.0.0.1') #连接

首先,调用 MongoClient 方法对数据库进行连接,参数一般我们写两个,host 写主机 ip ,还有一个是 port 端口号,port默认的话是 27017 可以省略。

db = client.traffic  # 数据库名为 traffic
print(db)

创建一个名字叫 traffic 的数据库,并且打印返回如上图所示。

注意:如果 MongoDB 中无此库,需要在创建集合并且插入文档后,数据库方可自动创建。

什么意思呢?让我们用命令行工具来查看下,当 MongoDB 服务启动后,可以通过 bin 文件夹下的 mongo 进行连接,windows 系统大家可以自行右键 shift ,打开cmd进行操作,直接类似如下操作:




通过 show dbs; 命令查看当前 MongoDB 的数据库,而实则上,这里的命令对应的就是上一篇中图形化界面查看的样子:



所以,其实图形化界面的背后真谛,对应的都是命令行的执行。如果你新学了某一项新的技术,那么如果从命令行倒着往上层学习,只会事半功倍。

当然,除了以上的操作,还可以通过 py 代码去查询:

db_list = client.list_database_names()



代码的顺序,是先执行了创建数据库的操作,在执行了读取数据库的操作,可以看到,数据库并没有被创建

3. py 插入 MongoDB 数据库(增加操作,简称增)

import pymongo

client = pymongo.MongoClient(host='127.0.0.1')
db = client.traffic
collections = db.person  # 创建集合,student 相当于 mysql 的表名



当创建了名为 person 的集合时,执行代码,依然没有生成数据库。继续来为文档中插入文档和字段。

# 创建文档数据
person_one = {
    'name': '咪哥杂谈',
    'age': '24',
    'height': '175',
    'weight': '60'
}
result = collections.insert_one(person_one)  # 文档插入集合
print(result)  # 打印结果
print(result.inserted_id)  # 打印插入数据的返回 id 标识



使用 insert_one 对文档进行单条数据插入,返回结果自带了一个 inserted_id 的属性,当插入单条数据成功时,便返回个唯一 id 标识。


如何验证 MongoDB 中是否成功插入了呢?有三种方案,先来说前两种。

其一,最简单的方式,通过图形化工具直接进行查看,不难发现,当我们插入文档时,数据库可以看到有结果显示了:





其二,使用命令行的客户端进行查看(没有图形化工具的情况下):

show dbs;  # 展示数据库
use traffic;  # 使用数据库
show collections;  # 展示所有集合
db.person.find().pretty()  # 查询集合下所有的文档,并整齐显示




pretty()中文是漂亮的意思,写上就是整齐展示,不写就是普通显示。


忘记说了~上面仅仅是一条数据插入,但如果你想对多条数据插入,可以这样操作:

# 创建文档数据
person_one = {
    'name': '咪哥杂谈',
    'age': '24',
    'height': '175',
    'weight': '60'
}

person_two = {
    'name': '咪哥杂谈_two',
    'age': '22',
    'height': '180',
    'weight': '63'
}

result = collections.insert_many([person_one, person_two])  # 文档插入集合
print(result)
print(result.inserted_ids)



使用 insert_many 对文档进行多条数据插入,返回结果自带了一个 inserted_ids 的属性,当插入多条数据成功时,便返回个数组唯一 id 标识。


其三,便是使用我们的 py 进行查库操作,下面开新节点介绍。

4. py 查询 MongoDB 数据库(查询操作,简称查)

查询可以查询一条 find_one() 方法:



查询多条,调用 find () 方法:



一般我们用 find() 查询就行,既然是查询,当然我们可以对其指定想要返回的字段,就像 sql 数据库中 一样:

select name,age from person

在 find() 方法里,传入如下代码,0代表不要,1代表要,注意,里面是两个参数,第一个参数是空的对象:

result = collections.find({}, {'_id': 0, 'name': 1, 'age': 1})
for a in result:
    print(a)

result = collections.find({}, {'name': 1, 'age': 1})
for a in result:
    print(a)



发现二者的区别了吗?唯一标识 _id 如果不手动置为 0 ,它是不会自动隐藏的,所以当你只想查询 name 和 age 字段时,需要手动 _id 置 0。

注意: 同时指定了 0 和 1 则会报错,除了 _id 与其他字段不同的情况:




查询还可以根据设定条件进行查询,如 MySQL 中的这样:

select * from person where age = '22';

在 python 中,要如下使用,仅传入一个参数:

result2 = collections.find({'age': '22'})



查询到这里就结束了,本质上来说,MongoDB 还支持一些高级查询语法,比如通过正则表达式去查询,或是当条件与数字进行对比判断时,如何书写。但本项目中应该不涉及到高级查询,所以就不多介绍了,感兴趣的可以看下崔庆才老师的这篇博客,里面写的通俗易懂。

[Python3网络爬虫开发实战] 5.3.1-MongoDB存储?cuiqingcai.com

总结

本篇介绍了 py 操作 mongo 的增加查询操作,还有更新和删除操作留在下一篇。篇幅有些过长了。

相关推荐

辞旧迎新,新手使用Containerd时的几点须知

相信大家在2020年岁末都被Kubernetes即将抛弃Docker的消息刷屏了。事实上作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使...

分布式日志系统ELK+skywalking分布式链路完整搭建流程

开头在分布式系统中,日志跟踪是一件很令程序员头疼的问题,在遇到生产问题时,如果是多节点需要打开多节点服务器去跟踪问题,如果下游也是多节点且调用多个服务,那就更麻烦,再者,如果没有分布式链路,在生产日志...

Linux用户和用户组管理

1、用户账户概述-AAA介绍AAA指的是Authentication、Authorization、Accounting,即认证、授权和审计。?认证:验证用户是否可以获得权限,是3A的第一步,即验证身份...

linux查看最后N条日志

其实很简单,只需要用到tail这个命令tail-100catalina.out输入以上命令,就能列出catalina.out的最后100行。...

解决linux系统日志时间错误的问题

今天发现一台虚拟机下的系统日志:/var/log/messages,文件时间戳不对,跟正常时间差了12个小时。按网上说的执行了servicersyslogrestart重启syslog服务,还是不...

全程软件测试(六十二):软件测试工作如何运用Linux—读书笔记

从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到。对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux...

Linux运维之为Nginx添加错误日志(error_log)配置

Nginx错误日志信息介绍配置记录Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(nginx_core_module)的参数,该参数名字为error_log,可以放在不同的虚机主...

Linux使用swatchdog实时监控日志文件的变化

1.前言本教程主要讲解在Linux系统中如何使用swatchdog实时监控日志文件的变化。swatchdog(SimpleWATCHDOG)是一个简单的Perl脚本,用于监视类Unix系统(比如...

syslog服务详解

背景:需求来自于一个客户想将服务器的日志转发到自己的日志服务器上,所以希望我们能提供这个转发的功能,同时还要满足syslog协议。1什么是syslog服务1.1syslog标准协议如下图这里的fa...

linux日志文件的管理、备份及日志服务器的搭建

日志文件存放目录:/var/log[root@xinglog]#cd/var/log[root@xinglog]#lsmessages:系统日志secure:登录日志———————————...

运维之日志管理简介

日志简介在运维过程中,日志是必不可少的东西,通过日志可以快速发现问题所在。日志分类日志分类,对不同的日志进行不同维度的分析。操作系统日志操作系统是基础,应用都是在其之上;操作系统日志的分析,可以反馈出...

Apache Log4j 爆核弹级漏洞,Spring Boot 默认日志框架就能完美躲过

这两天沸沸扬扬的Log4j2漏洞门事件炒得热火朝天:突发!ApacheLog4j2报核弹级漏洞。。赶紧修复!!|Java技术栈|Java|SpringBoot|Spring...

Linux服务器存在大量log日志,如何快速定位错误?

来源:blog.csdn.net/nan1996jiang/articlep/details/109550303针对大量log日志快速定位错误地方tail/head简单命令使用:附加针对大量log日志...

Linux中查看日志文件的正确姿势,求你别tail走天下了!

作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了。尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于我这种小菜鸡来说,第一反应就是cat,tail,vi(或...

分享几款常用的付费日志系统,献给迷茫的你!

概述在前一篇文章中,我们分享了几款免费的日志服务器。他们各有各的特点,但是大家有不同的需求,有时免费的服务器不能满足大家的需要,下面推荐几款付费的日志服务器。1.Nagios日志服务器Nagio...

取消回复欢迎 发表评论: