热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python中使用MongoDB详解

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

作者: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)

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

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)

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

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

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

datetime.datetime.now().isoformat()

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

7.删除一条数据 delete_one()

delete_one() 详细说明参考

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

删除前的数据如下:

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

mongo_collection.delete_one({'text' : 'a'})

删除后的数据如下:

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

8.删除多条数据 delete_many()

delete_many() 详细说明参考

删除满足条件的所有数据

删除前的数据如下:

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

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

删除后的数据如下:

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

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,更新条件没找到,则插入更新的内容

更新前的数据如下:

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

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})

更新后的数据:

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

10.更新多条数据 update_many()

update_many() 详细说明参考

更新满足条件的所有数据

更新前的数据如下:

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

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})

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

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

update_one() 详细说明参考

通过设置upsert为True即可

更新前的数据如下:

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

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)

更新后的数据如下:

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

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形式返回

删除前的数据:

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

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)

删除后的数据:

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

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)

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》

由上图可以看到:

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

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

详细参考这里

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

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

23.删除集合 drop()

mongo_collection.drop()

24.符号$参考表

《Python中使用MongoDB详解》
《Python中使用MongoDB详解》


推荐阅读
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 利用C#技术实现Word文档的动态生成与编辑
    本文通过一个简单的示例,介绍了如何使用C#语言实现Word文档的动态生成与编辑功能。文章详细阐述了在项目中引用Word动态库的方法,并通过具体代码示例展示了如何创建和操作Word表格。此内容旨在为初学者提供参考和学习资料,欢迎读者提出宝贵意见和建议。 ... [详细]
  • C#编程指南:实现列表与WPF数据网格的高效绑定方法 ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • MySQL:不仅仅是数据库那么简单
    MySQL不仅是一款高效、可靠的数据库管理系统,它还具备丰富的功能和扩展性,支持多种存储引擎,适用于各种应用场景。从简单的网站开发到复杂的企业级应用,MySQL都能提供强大的数据管理和优化能力,满足不同用户的需求。其开源特性也促进了社区的活跃发展,为技术进步提供了持续动力。 ... [详细]
  • 深入解析:RKHunter与AIDE在入侵检测中的应用与优势
    本文深入探讨了RKHunter与AIDE在入侵检测领域的应用及其独特优势。通过对比分析,详细阐述了这两种工具在系统完整性验证、恶意软件检测及日志文件监控等方面的技术特点和实际效果,为安全管理人员提供了有效的防护策略建议。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • 本文介绍了如何通过掌握 IScroll 技巧来实现流畅的上拉加载和下拉刷新功能。首先,需要按正确的顺序引入相关文件:1. Zepto;2. iScroll.js;3. scroll-probe.js。此外,还提供了完整的代码示例,可在 GitHub 仓库中查看。通过这些步骤,开发者可以轻松实现高效、流畅的滚动效果,提升用户体验。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 在Python编程中,掌握高级技巧对于提升代码效率和可读性至关重要。本文重点探讨了生成器和迭代器的应用,这两种工具不仅能够优化内存使用,还能简化复杂数据处理流程。生成器通过按需生成数据,避免了大量数据加载对内存的占用,而迭代器则提供了一种优雅的方式来遍历集合对象。此外,文章还深入解析了这些高级特性的实际应用场景,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 本文深入探讨了 Python Watchdog 库的使用方法和应用场景。通过详细的代码示例,展示了如何利用 Watchdog 监控文件系统的变化,包括文件的创建、修改和删除等操作。文章不仅介绍了 Watchdog 的基本功能,还探讨了其在实际项目中的高级应用,如日志监控和自动化任务触发。读者将能够全面了解 Watchdog 的工作原理及其在不同场景下的应用技巧。 ... [详细]
  • 本文全面概述了MySQL的发展历程与演进。最初,我们旨在通过自定义的快速低级(ISAM)接口连接到表格,利用mSQL数据库系统。随着时间的推移,MySQL不仅在性能和稳定性上取得了显著提升,还引入了多种高级功能,如事务处理、存储过程和视图等,成为全球广泛使用的开源数据库管理系统之一。 ... [详细]
  • 本文将介绍一种扩展的ASP.NET MVC三层架构框架,并通过使用StructureMap实现依赖注入,以降低代码间的耦合度。该方法不仅能够提高代码的可维护性和可测试性,还能增强系统的灵活性和扩展性。通过具体实践案例,详细阐述了如何在实际开发中有效应用这一技术。 ... [详细]
author-avatar
yueloong
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有