mongodb python 大于_Python中使用MongoDB详解

ab8852eb3d44618a8c542c58e91ec4a9.png
作者:Zarten知乎专栏:Python爬虫深入详解知乎ID: Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 !

介绍

MongoDB是一种面向文档型的非关系型数据库(NoSQL),由C++编写。非关系数据库中是以键值对存储,结构不固定,易存储,减少时间和空间的开销。文档型数据库通常是以JSON或XML格式存储数据,而Mongodb使用的数据结构是BSON(二进制JSON),和JSON相比,BSON提高了存储和扫描效率,但空间占用会更多一些。

在python中操作MongoDB,我们使用PyMongo,下面着重介绍。

PyMongo的使用

前提:安装了MongoDB服务器,若没有,点击这里安装

1.安装

pip3 install pymongo

2.连接

  • 第1种方式:
#无密码连接
import pymongo
mongo_client = pymongo.MongoClient('127.0.0.1', 27017)#有密码连接
import pymongo
mongo_client = pymongo.MongoClient('127.0.0.1', 26666)
mongo_auth = mongo_client.admin #或 mongo_client['admin'] admin为authenticationDatabase
mongo_auth.authenticate('用户名', '密码')
  • 第2种方式:
#无密码连接
import pymongo
mongo_client = pymongo.MongoClient('mongodb://127.0.0.1:27017')#有密码连接
import pymongo
import urllib.parse
mongo_username = urllib.parse.quote_plus('你的用户名')
mongo_password = urllib.parse.quote_plus('密码')
mongo_client = pymongo.MongoClient('mongodb://%s:%s@127.0.0.1:26666' % (mongo_username, mongo_password))
print(mongo_client.server_info()) #判断是否连接成功

判断是否连接成功:

print(mongo_client.server_info()) #判断是否连接成功

3.获取Database 和 Collection

若没有Database 和Collection,则会自动创建

第一种方式:

mongo_db = mongo_client['你的database']
mongo_collection = mongo_db['你的collection']

第二种方式:

mongo_db = mongo_client.你的database
mongo_collection = mongo_db.你的collection

CURD操作

4.插入单条数据 insert_one()

insert_one() 详细说明参考

import datetime
info = {'name' : 'Zarten','text' : 'Inserting a Document','tags' : ['a', 'b', 'c'],'date' : datetime.datetime.now()
}
mongo_collection.insert_one(info)

fac563d4040c131f42f5920bca736bc3.png

5.插入多条数据 insert_many()

insert_many() 详细说明参考

import datetime
info_1 = {'name' : 'Zarten_1','text' : 'Inserting a Document','tags' : ['a', 'b', 'c'],'date' : datetime.datetime.now()
}info_2 = {'name' : 'Zarten_2','text' : 'Inserting a Document','tags' : [1, 2, 3],'date' : datetime.datetime.now()
}insert_list = [info_1, info_2]
mongo_collection.insert_many(insert_list)

c3df59171b9e32b9ba7e1140d5e9a273.png

6.插入字符串类型的时间

由上图可以看到插入字符串时间时,mongodb自动转成了 ISOdate类型,若需要时间在mongdb也是字符串类型,只需这样操作即可

datetime.datetime.now().isoformat()

836a85e2de02b92e3094b4f928eb7585.png

7.删除一条数据 delete_one()

delete_one() 详细说明参考

删除一条数据。若删除条件相同匹配到多条数据,默认删除第一条

删除前的数据如下:

36ee4cbcb218af205e658aff05bce5de.png
mongo_collection.delete_one({'text' : 'a'})

删除后的数据如下:

afcad223952c2f2745e6317559b6e937.png

8.删除多条数据 delete_many()

delete_many() 详细说明参考

删除满足条件的所有数据

删除前的数据如下:

d6aca5307f92650d7e654f049217fe0d.png
mongo_collection.delete_many({'text' : 'a'})

删除后的数据如下:

2215cd0763d9b2407d97540176b5f267.png

9.更新单条数据 update_one()

update_one() 详细说明参考

只会更新满足条件的第一条数据

update_one(filter,update,upsert=False,bypass_document_validation=False,collation=None,array_filters=None,session=None)

  • 第一个参数 filter:更新的条件
  • 第二个参数 update : 更新的内容,必须用$操作符
  • 第三个参数 upsert : 默认False。若为True,更新条件没找到,则插入更新的内容

更新前的数据如下:

731a3e4d93de9daef97750daedb15f40.png
info = {'name': '桃子 ','text': 'peach','tags': [1, 2, 3],'date': datetime.datetime.now()}
update_condition = {'name' : 'Zarten_2'} #更新的条件,也可以为多个条件
#更新条件多个时,需要同时满足时才会更新
# update_condition = {'name' : 'Pear',
#                     'text' : '梨子'}mongo_collection.update_one(update_condition, {'$set' : info})

更新后的数据:

4cbceb313f2b7b0dd9b7aeed49d7a10f.png

10.更新多条数据 update_many()

update_many() 详细说明参考

更新满足条件的所有数据

更新前的数据如下:

918a0444a70d9b90962c038972a5185d.png
info = {'name': 'Zarten','text': 'a','tags': [1, 2, 3],'date': datetime.datetime.now()}
update_condition = {'text' : 'a'} #更新的条件
#更新条件多个时,需要同时满足时才会更新
# update_condition = {'name' : 'Pear',
#                     'text' : '梨子'}mongo_collection.update_many(update_condition, {'$set' : info})

540a34621c22c0e7df40a5e5720a88ef.png

11.更新时,若无满足条件,则插入数据

update_one() 详细说明参考

通过设置upsert为True即可

更新前的数据如下:

f50e8dd57364bda162fc4869a17c7bc9.png
info = {'name': 'Banana','text': '香蕉','tags': [1, 2, 3],'date': datetime.datetime.now()
}
update_condition = {'text' : 'a'} #更新的条件
#更新条件多个时,需要同时满足时才会更新
# update_condition = {'name' : 'Pear',
#                     'text' : '梨子'}mongo_collection.update_many(update_condition, {'$set' : info}, upsert= True)

更新后的数据如下:

1b76693170230e6fab4875e0e124f486.png

12.查询一条数据 find_one()

find_one() 详细说明

匹配第一条满足的条件的结果,这条结果以dict字典形式返回,若没有查询到,则返回None

find_condition = {'name' : 'Banana','text' : 'peach'
}
find_result = mongo_collection.find_one(find_condition)

可以通过projection参数来指定需要查询的字段,包括是否显示 _id ,更多具体用法参考 find()

find_condition = {'name' : 'Zarten_3',
}
select_item = mongo_collection.find_one(find_condition, projection= {'_id':False, 'name':True, 'num':True})
print(select_item)

13.查询范围

查询范围具体参考这里

范围查询通常用$ 例如:$gte 大于等于 $lt 小于;具体的$符号在文章末尾查看

例如:查询一段时间内的数据

import datetime
find_condition = {'date' : {'$gte':datetime.datetime(2018,12,1), '$lt':datetime.datetime(2018,12,3)}
}
select_item = mongo_collection.find_one(find_condition)
print(select_item)

14.查询多条数据 find()

find() 详细说明

返回满足条件的所有结果,返回类型为 Cursor ,通过迭代获取每个查询结果,每个结果类型为dict字典

find_condition = {'name' : 'Banana','text' : '香蕉'
}
find_result_cursor = mongo_collection.find(find_condition)
for find_result in find_result_cursor:print(find_result)

15.通过 _id 来查询

查询条件中_id 类型是ObjectId类型,也就是插入时返回的对象。

若 _id 提供的是str类型的,我们需要转成ObjectId类型

from bson.objectid import ObjectId
query_id_str = '5c00f60b20b531196c02d657'
find_condition = {'_id' : ObjectId(query_id_str),
}
find_result = mongo_collection.find_one(find_condition)
print(find_result)

16.查询一条数据同时删除 find_one_and_delete()

find_one_and_delete(filter,projection=None,sort=None,session=None,**kwargs) 详细说明

  • filter:查询条件
  • projection:选择返回和不返回的字段
  • sort:list类型,当查询匹配到多条数据时,根据某个条件排序,函数返回时返回第一条数据

只能返回一条数据

此函数的特别之处在于,它会返回被删除的信息,以字典dict形式返回

删除前的数据:

5f2c05864444f9f1d9b6b1c7cecc7cf0.png

17.查询并删除,匹配单条数据

find_condition = {'name' : 'Banana',
}
deleted_item = mongo_collection.find_one_and_delete(find_condition)
print(deleted_item)

18.查询并删除,匹配多条数据,有选择的返回某条数据

通过sort参数

find_condition = {'name' : 'Zarten_2',
}
deleted_item = mongo_collection.find_one_and_delete(find_condition, sort= [('num', pymongo.DESCENDING)])
print(deleted_item)

删除后的数据:

86a165c9720a7e10db9aa532ea30c761.png

19.计数

count_documents() 详细说明

注意:此函数在3.7版本添加,以下的版本无法使用,本人版本为3.6.3 固无法使用

find_condition = {'name' : 'Zarten_1'
}
select_count = mongo_collection.count_documents(find_condition)
print(select_count)

20.创建索引 create_index()

create_index() 详细说明

插入数据时,已经有一个_id索引了,我们还可以自定义创建索引

参数 unique设置为True时,创建一个唯一索引,索引字段插入相同值时会自动报错。默认为False,为False时可以插入相同值

mongo_collection.create_index('name', unique= True)

21.获取索引信息

list_indexes() 和 index_information() 详细说明参考这里

# list_indexs = mongo_collection.list_indexes()
# for index in list_indexs:
#     print(index)index_info = mongo_collection.index_information()
print(index_info)

73335ba7b06496fd343491a0648c2ec3.png

由上图可以看到:

索引的名称自动作了处理,变成了别名 name_1

22.删除索引 drop_index() 和 drop_indexes()

详细参考这里

需要使用索引的别名,没有则抛出错误

del_index = mongo_collection.drop_index('name_1')
print(del_index)

23.删除集合 drop()

mongo_collection.drop()

24.符号$参考表

8b9d958e70ae5fb898a82a7abb5fa3d2.png

Pymongo常用操作

  • 根据_id查询数据插入时间排序
col.find().sort('_id',-1) #根据插入时间降序
  • 根据_id查询某个日期插入的数据

比如查询今天插入的所有数据

import datetime
from bson.objectid import ObjectIdtoday_zero = datetime.datetime.strptime(datetime.datetime.now().strftime("%Y-%m-%d"), "%Y-%m-%d")
dummy_id = ObjectId.from_datetime(today_zero)
results = col.find({"_id": {"$gte": dummy_id}}).limit(10)
for result in results:print(result)

比如查询15天前的那天日期的所有插入数据

import datetime
from bson.objectid import ObjectIdstart_day_time = datetime.datetime.today() - datetime.timedelta(15)
end_day_time = datetime.datetime.today() - datetime.timedelta(14)start_day_zero = datetime.datetime.strptime(start_day_time.strftime("%Y-%m-%d"), "%Y-%m-%d")
end_day_zero = datetime.datetime.strptime(end_day_time.strftime("%Y-%m-%d"), "%Y-%m-%d")start_dummy_id = ObjectId.from_datetime(start_day_zero)
end_dummy_id = ObjectId.from_datetime(end_day_zero)results_count = col.find({"_id": {"$gte": start_dummy_id,"$lte":end_dummy_id}}).count()
print(results_count)

比如昨天插入数据

start_day_time = datetime.datetime.today() - datetime.timedelta(1)
end_day_time = datetime.datetime.today() - datetime.timedelta(0)start_day_zero = datetime.datetime.strptime(start_day_time.strftime("%Y-%m-%d"), "%Y-%m-%d")
end_day_zero = datetime.datetime.strptime(end_day_time.strftime("%Y-%m-%d"), "%Y-%m-%d")start_dummy_id = ObjectId.from_datetime(start_day_zero)
end_dummy_id = ObjectId.from_datetime(end_day_zero)results_count = col.find({"_id": {"$gte": start_dummy_id,"$lte":end_dummy_id}}).count()print(results_count)

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

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

相关文章

这不是商业互吹,是学习的宝藏

学习如逆水行舟,不进则退;只有坚持不断的学习,才能保持进步。今天给大家精心挑选的这几个优质的公众号,在行业深耕已久,相信大家一定会有所收获,感兴趣的可以关注一下。互联网架构师 号主985计算机硕士毕业&#xff…

关于这些那些

关于篮球先说下,我刚才已经写完文章了,但是因为没有保存,浏览器想着周末早点回去休息就闪退了,把写好的文章给闪退没有了,这个真是拿起自己的坑砸死了自己,那种赶脚只有自己能够明白,真的是太难…

mysqldump 定时备份数据(全量)

MYSQL 数据库备份有很多种(cp、tar、lvm2、mysqldump、xtarbackup)等等,具体使用哪一个还要看你的数据规模。下面给出一个表 #摘自《学会用各种姿态备份Mysql数据库》 备份方法备份速度恢复速度便捷性功能一般用于cp快快一般、灵活性低很弱少量数据备份mysqldump慢慢…

第3章 Linux内核调试手段之内核打印

开始前面说的话在我写代码的生涯里,我看到过很多大神炫耀自己的调试手段,也看到很多大神写过非常厉害的代码,我认为,相比于写代码,调试更加重要,而那些能在写代码的时候就加入了自己的调试信息的&#xff0…

电源管理 解析_智能电源控制箱

智能电源控制箱?智能电源控制箱又被称之为:智能监控箱、智能设备箱、智能运维箱,智能电源控制箱的作用主要就是为视频监控打造良好的运行环境,保障视频监控系统稳定的运行。说到视频监控,大家都知道视频监控的故障率是比较高的&a…

centos7 开机后进去了命令行_Linux系统管理:开机启动流程(二)

CentOS71.BIOS(开机自检)2.MBR ( Master Boot Record 主引导记录)3.GRUB2 Bootloader(引导菜单)4.Kernel(内核引导)5.Systemd (不再使用init,改成了systemd)6.Runlevel-Target (运行…

一点小思考

我记得12年的时候,我就申请了微信公众号,那时候我的号主是TCL,是公司的同事用我的微信号申请公司的主体号,那时候我也有一点想法自己做个公众号写点文章,但是一直没有下决心,后来离职了,原来用我…

第3章 Linux内核调试手段之二

gdb 和 addr2line 调试内核模块内核模块插入内核链表的时候,会调用 init 里面的程序,我们上面给的那个例程的程序因为是经过多年风吹雨打的,但是如果你是一个萌新的码农,你能保证自己写的内核模块没有问题吗?所以就需要…

儿童手表怎么删除联系人_华为儿童手表4X体验:与你一起守护孩子的成长,带娃不再辛苦...

带娃是一件很辛苦的事情,从身体到精神的辛苦,相信各位家长都懂。对于照看正在成长期的孩子,更是让很多家长亲身感受"成长的烦恼"。孩子活泼好动的天性让很多家长都不放心,同时大部分家长又没有能力随时在身边守护&#…

Jmeter分布式测试过程中遇到的问题及摘抄前辈问题汇总

遇到的常见问题: 1、在Controller端上控制某台机器Run,提示"Bad call to remote host"。 解决方法:检查被控制机器上的jmeter-server有没有启动,或者JMeter.properties中remote_hosts的配置错误。2、Agent机器启动Jmete…

介绍一个我创业的朋友

大家好,今天给大家介绍一位跟我一样正在创业路上的朋友,不知道大家对我之前的文章还有没有印象,最近我在做一件特别有意思的事情,这件有意思的事情一直催促着我起床上班,每天都充满能量和动力,又累又充实的…

微信小程序装修解决方案ppt_装修公司微信小程序都有哪些功能?

传统装修行业存在收费不透明、消费者装修服务过程体验差等问题,传统装修已无法满足消费者的实际需求,面临无客量、无签约的困境。然而,随着移动互联网的发展,许多装饰企业利用微信小程序来帮助其疏导和推广。一个装修公司小程序能…

要用什么态度去面对生活?

最近,张扣扣的新闻铺天盖地,因为我非常喜欢逛知乎,刚好张扣扣的新闻这几天上了知乎热搜,所以我就关注上了,说实话,有点痛心,外人看起来很爽,忍辱负重好多年,终于把自己的…

第3章 Linux内核调试手段之三

之前的内核调试,我觉得应该再加上下面的东西,只有好好把下面的几个问题研究透了,你可能才是一个真正的内核高手,或者说,你还不是一个高手,就是一个内核的普通工程师,这个是我和Z总聊天说的&…

中希尔排序例题代码_【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章...

码农有道 历史文章目录(请戳我)关于码农有道(请戳我)前言本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程。预计阅读时间 47 分钟,强烈建议先收藏然后通过电脑端进行阅读。No.1 冒泡排序冒泡排序无疑是最为出名…

星期四随笔

周二的晚上,发了一篇文章,题目是《要用什么态度去面对生活》,发文是凌晨1点,早上7点起来,用手机刷了一下,很多回复,其中几个回复有点偏激,感觉被刺痛了,毕竟是睡着的&…

根据大小分割大文本_基于深度学习的图像分割在高德地图的实践

一、前言图像分割(Image Segmentation)是计算机视觉领域中的一项重要基础技术,是图像理解中的重要一环。图像分割是将数字图像细分为多个图像子区域的过程,通过简化或改变图像的表示形式,让图像能够更加容易被理解。更简单地说,图…

别人不让你发传单怎么办?

人生在世难免遇到几个傻逼,我今天没有上班,去外面兼职发了一天的传单,也许你们没有过发传单的经历,当然了,我也不是想为了增加人生阅历去发传单,单纯就是今天没什么事情,刚刚好公司停电&#xf…

模块化加载_谈谈双亲委派模型的第四次破坏-模块化

前言JDK9引入了Java模块化系统(Java Platform Moudle System)来实现可配置的封装隔离机制,同时JVM对类加载的架构也做出了调整,也就是双亲委派模型的第四次破坏。前三次破坏分别是:双亲委派模型推出之前,SPI机制,以及O…

第4章 原子操作

有一件事情,你不得不承认,C语言相对汇编来说是高级语言,为什么,因为高级语言会形成封装,比如,我需要把一个变量A,对于CPU来说,先从内存里把这个变量读进运算寄存器,然后运…