MongoDB 是一款面向文档型的 NoSQL 数据库,是一个基于分布式文件存储的开源的非关系型数据库系统,其内容是以 K/V 形式存储,结构不固定,它的字段值可以包含其他文档、数组和文档数组等。其采用的 BSON(二进制 JSON )的数据结构,可以提高存储和扫描效率,但空间开销会有些大。今天就为大家简单介绍下在 Python 中使用 MongoDB 。

安装 PyMongo 库

在 Python 中操作 MongoDB ,需要使用 PyMongo 库,执行如下命令安装:

pip3 install pymongo

连接 MongoDB 数据库

连接时需要使用 PyMongo 库里面的 MongoClient 模块,有两种方式可以创建连接,默认只需要传入IP和端口号即可。如果数据库存在账号密码,则需要指定连接的数据库,并进行鉴权才能连接成功。

#导入 MongoClient 模块
from pymongo import MongoClient, ASCENDING, DESCENDING# 两种方式
#1. 传入数据库IP和端口号
mc = MongoClient('127.0.0.1', 27017)#2. 直接传入连接字串
mc = MongoClient('mongodb://127.0.0.1:27017')# 有密码的连接
# 首先指定连接testdb数据库
db = mc.testdb# 通过authenticate方法认证账号密码
db.authenticate('username','password')# 检查是否连接成功,输出以下结果表示连接成功
print(mc.server_info())
# {'version': '4.2.1', 'gitVersion': 'edf6d45851c0b9ee15548f0f847df141764a317e', 'modules': [], 'allocator': 'tcmalloc', 'javascriptEngine': 'mozjs', 'sysInfo': 'deprecated', 'versionArray': [4, 2, 1, 0], 'openssl': {'running': 'OpenSSL 1.1.1  11 Sep 2018', 'compiled': 'OpenSSL 1.1.1  11 Sep 2018'},  ……省略 ,  'ok': 1.0}

MongoDB 数据库操作

成功连接数据库,接下来我们开始介绍通过 MongoClient 模块如何对 mongoDB 数据库进行 CURD 的操作。

获取数据库和集合

首先要指定需要操作的数据库和集合,这里的数据库可以对应为 Mysql 的 DataBase,集合对应为 Mysql 的 Table。需要注意的是在 mongoDB 中,不需要提前创建数据库和集合,在你操作它们时如果没有则会自动创建,但都是延时创建的,在添加 Document 时才会真正创建。

# 指定操作数据库的两种方式
#1. 获取 testdb 数据库,没有则自动创建
db = mc.testdb#2. 效果与上面 db = mc.testdb 相同
db = mc['testdb']# 打印出testdb数据库下所有集合(表)
print(db.collection_names())# 指定操作集合的两种方式
#1. 获取 test 集合,没有则自动创建
collection = db.test#2. 效果与 collection = db.test 相同
collection = db['test']# 打印集合中一行数据
print(collection.find_one())

数据的插入操作

在 MongoDB 中,每条数据其实都有一个 _id 属性作为唯一标识。如果没有显式指明该属性,MongoDB 会自动产生一个 ObjectId 类型的 _id 属性,insert() 方法会在执行后返回 _id 值。不过在 PyMongo 3.x 版本中,官方已经不推荐使用 insert() 方法,而是推荐使用insert_one() 和 insert_many() 方法来分别插入单条记录和多条记录。

# 要插入到集合中的对象
book = {'name' : 'Python基础','author' : '张三','page' : 80
}# 向集合中插入一条记录
collection.insert_one(book)
# 返回结果:{'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基础', 'author': '张三', 'page': 80}# 对于insert_many()方法,我们可以将数据以列表形式传递参数
book1 = {'name' : 'Java基础','author' : '李白','page' : 100
}
book2 = {'name' : 'Java虚拟机','author' : '王五','page' : 100
}# 创建 book_list 列表
book_list = [book1, book2]# 向集合中插入多条记录
collection.insert_many(book_list)
# 返回结果: <pymongo.results.InsertManyResult object at 0x7f80a39fa408>

数据的查询操作

查询需要使用 find_one() 或 find() 方法,其中 find_one() 查询得到的是单个结果,即一条记录,find() 则返回一个生成器对象。下面我们就来查询上面刚插入的数据,如果查询不到数据则返回 None ,代码如下:

# 通过条件查询一条记录,如果不存在则返回None
res = collection.find_one({'author': '张三'})
print (res)
# 打印结果:{'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基础', 'author': '张三', 'page': 80}# 通过条件查询多条记录,如果不存在则返回None
res = collection.find({'page': 100})
print (res)
#打印结果:<pymongo.cursor.Cursor object at 0x7f80a39daa58># 使用 find() 查询会返回一个对象
# 遍历对象,并打印查询结果
for r in res:print(r)
#打印结果:
# {'_id': ObjectId('5de4c8ae0ae08431839ac2a8'), 'name': 'Java基础', 'author': '李白', 'page': 100}
# {'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虚拟机', 'author': '王五', 'page': 100}# 查询page大于50的记录
res = collection.find({'page': {'$gt': 50}})
# 通过遍历返回对象,结果如下:
# {'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基础', 'author': '张三', 'page': 80}
# {'_id': ObjectId('5de4c8ae0ae08431839ac2a8'), 'name': 'Java基础', 'author': '李白', 'page': 100}
# {'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虚拟机', 'author': '王五', 'page': 100}

上面查询条件中我们用到了 $gt 的比较运算符,关于查询条件中的比较运算符和功能运算符对照表如下:

符号含义举例$gt大于{‘page’: {‘$gt’: 50}$lt小于 $lte小于等于 $gte大于等于 $ne不等于 $in在范围内{‘page’: {‘$in’: [50, 100]}}$nin不在范围内{‘page’: {‘$nin’: [50, 100]}}$regex匹配正则表达式{‘name’: {‘$regex’: ‘^张.*’}}$exists属性是否存在{‘name’: {‘$exists’: True}}$type类型判断{‘name’: {‘$type’: ‘string’}}$mod数字模操作{‘page’: {‘$mod’: [80, 10]}}$text文本查询{‘$text’: {‘$search’: ‘Java’}}$where高级条件查询{‘$where’: ‘obj. author == obj. full_name’}

数据的更新操作

更新操作和插入操作类似,PyMongo 提供了两种更新方法,即 update_one() 和 update_many() 方法,其中 update_one() 方法只会更新满足条件的第一条记录。

注意: 如果使用 $set,则只更新 book 对象内存在的字段,如果更新前还有其他字段,则不更新也不删除。如果不使用 $set,则会把更新前的数据全部用 book 对象替换,如果原本存在其他字段则会被删除。

# 查询一条记录
book = collection.find_one({'author': '张三'})
book['page'] = 90# 更新满足条件{'author', '张三'}的第一条记录
res = collection.update_one({'author': '张三'}, {'$set': book})# 更新返回结果是一个对象,我们可以调用matched_count和modified_count属性分别获得匹配的数据条数和影响的数据条数。
print(res.matched_count, res.modified_count)
#打印结果:1 1# 更新满足条件 page>90 的所有记录,page 字段自加 10
res = collection.update_many({'page': {'$gt': 90}}, {'$inc': {'page': 10}})# 打印更新匹配和影响的记录数
print(res.matched_count, res.modified_count)
#打印结果:2 2book3 = {'name':'Python高级', 'author':'赵飞', 'page': 50}#upsert=True表示如果没有满足更新条件的记录,则会将book3插入集合中
res = collection.update_one({'author': '赵飞'}, {'$set': book3}, upsert=True)
print(res.matched_count, res.modified_count)
#打印结果:0 0# 查询所有记录,并遍历打印出来
res = collection.find()
for r in res:print(r)
#打印结果:
# {'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基础', 'author': '张三', 'page': 90}
# {'_id': ObjectId('5de4c8ae0ae08431839ac2a8'), 'name': 'Java基础', 'author': '李白', 'page': 110}
# {'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虚拟机', 'author': '王五', 'page': 110}
# {'_id': ObjectId('5de4d76f71aa089d58170a92'), 'author': '赵飞', 'name': 'Python高级', 'page': 50}

集合的删除操作

删除数据同样推荐使用两个方法 delete_one() 和 delete_many() ,其中 delete_one() 为删除第一条符合条件的记录。具体操作代码如下:

# 删除满足条件的第一条记录
result = collection.delete_one({'author': '张三'})
# 同样可以通过返回对象的 deleted_count 属性查询删除的记录数
print(result.deleted_count)
# 打印结果:1# 删除满足条件的所有记录,以下为删除 page < 90 的记录
result = collection.delete_many({'page': {'$lt': 90}})
print(result.deleted_count)
# 打印结果:1

其他数据库操作

除了以上标准的数据库操作外,PyMongo 还提供了以下通用且方便的操作方法,比如 limit() 方法用来读取指定数量的数据 skip() 方法用来跳过指定数量的数据等,具体请看如下代码:

# 查询返回满足条件的记录然后删除
result = collection.find_one_and_delete({'author': '王五'})
print(result)
# 打印结果:{'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虚拟机', 'author': '王五', 'page': 110}# 统计查询结果个数
# 全部结果个数
collection.find().count()
# 返回结果:1# 满足条件结果个数
collection.find({'page': 100}).count()
# 返回结果:0# 查询结果按字段排序
# 升序
results = collection.find().sort('page', ASCENDING)# 降序
results = collection.find().sort('page', DESCENDING)# 下面查询结果是按page升序排序,只返回第二条记录及以后的两条结果
results = collection.find().sort('page', ASCENDING).skip(1).limit(2)
print(results)

注意:在数据量在在千万、亿级别庞大的时候,查询时最好 skip() 的值不要太大,这样很可能导致内存溢出。

数据索引操作

默认情况下,数据插入时已经有一个 _id 索引了,当然我们还可以创建自定义索引。

# unique=True时,创建一个唯一索引,索引字段插入相同值时会自动报错,默认为False
collection.create_index('page', unique= True)
# 打印结果:'page_1'# 打印出已创建的索引
print(collection.index_information())
# 返回结果:{'_id_': {'v': 2, 'key': [('_id', 1)], 'ns': 'testdb.test'}, 'page_1': {'v': 2, 'unique': True, 'key': [('page', 1)], 'ns': 'testdb.test'}}# 删除索引
collection.drop_index('page_1')#删除集合
collection.drop()

最后,小编想说:我是一名python开发工程师,

整理了一套最新的python系统学习教程,

想要这些资料的可以关注小编,加入专栏学习群(免费分享哦)希望能对你有所帮助.

mongodb 如何更改端口号_Python 操作 MongoDB 数据库介绍相关推荐

  1. Oracle如何更改端口号

    Oracle默认端口号为8080,因为Tomcat端口默认也是8080所以需要把Oracle端口更改一下,不建议更改Tomcat端口号 运行cmd命令行操作 查看Oracle版本: 链接Oracle数 ...

  2. flask项目中无法更改端口号

    flask项目中无法更改端口号 app.run(port=8000) 问题 启动后是 127.0.0.1:5000 解决方法

  3. mysql更改端口号3306

    mysql更改端口号3306 2021-11-10 10:47:29 1.登录mysql mysql -u root -p 2.查看MySQL当前使用的端口号 show global variable ...

  4. pythonmysql数据分析_Python操作Mysql数据库入门——数据导入pandas(数据分析准备)...

    原标题:Python操作Mysql数据库入门--数据导入pandas(数据分析准备) 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求 ...

  5. 用python向mongodb插入数据_Python操作MongoDB数据库(一)

    Python操作MongoDB数据库(一) 前言 干货文章继续出发!隔的时间有些久了哈,对 MongoDB 安装回顾的同学,可以看下windows环境 <初识 MongoDB 数据库>.这 ...

  6. mongodb用哪些端口号_mongodb端口号(mongodb默认端口号)

    mongodb端口号(mongodb默认端口号) 2020-05-07 22:12:49 共10个回答 如何查看mongodb的端口号 db.getMongo()就可以查看了,效果如下:>db. ...

  7. python数据库模糊查询_Python操作mongodb数据库进行模糊查询操作示例

    本文实例讲述了Python操作mongodb数据库进行模糊查询操作.分享给大家供大家参考,具体如下: # -*- coding: utf-8 -*- import pymongo import re ...

  8. mongodb用哪些端口号_mongodb启动命令与端口设置

    一.mongodb安装和配置 1.创建tools目录,用于存放安装包 cd /usr/local mkdir -p tools cd tools 2.下载mongodb包(其它版本请自行下载) wge ...

  9. MongoDB的安装到使用 + Python操作MongoDB + 有关系和无关系数据库比较

    day1 - day7 mongoDB学习第一天 数据库 MongoDB (芒果数据库) 数据存储阶段 文件管理阶段 (.txt .doc .xls) 优点 : 数据可以长期保存 可以存储大量的数据 ...

  10. mongodb python 大于_5、Python操作MongoDB

    Mongodb MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.MongoDB 旨在为WEB应用提供可扩展的高性能 ...

最新文章

  1. javascript中for循环和setTimeout同时使用,出现的问题
  2. 1.15 Java 9新增的不可变集合
  3. Java面试题:在一个递增的数组里面,找出任意两个数的和等于100,编写程序输出这些数对,可以假设数组中不存在重复元素
  4. php正则匹配标点符号,php 正则匹配包含字母、数字以及下划线,且至少包含2种...
  5. java判断时间是否在时间段内_具有C语言基础,利用半年时间学习Java是否够用
  6. 婧婧音乐开发笔记01篇-项目组织结构和布局文件
  7. Ext2、Ext3、Ext4的区别
  8. windwos 10打印机服务老是自动关闭
  9. 模拟Android微信APK底部的TabHost选项卡
  10. OceanBase社区版4.0,给了我很多惊喜
  11. mysql运维备份_MySQL运维经验
  12. mysql用update select批量处理数据
  13. 【未完成】【甄选靶场】Vulnhub百个项目渗透——项目四十一:DEFCON Toronto-Galahad(图像深层分析,流量分析)
  14. Qt扫盲-QSlider理论总结
  15. Android Navigation与BottomNavigationView实现底部导航栏
  16. 优化css性能有哪些方法?
  17. NestJs 学习(一) 基础知识
  18. Linux文件处理命令 file、mkdir、grep、dd、mv、diff
  19. 虚拟声源定位系统+环绕声场效果
  20. andriod驱动之旅-在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务(8)

热门文章

  1. Ubuntu LVM扩展LV
  2. 桥接模式 适配器模式 装饰模式
  3. wifi的country code
  4. 【转】UML的9种图例解析
  5. Hadoop 源代码分析(二三)FSDirectory
  6. app上传遇到的一些问题
  7. 在线的图片、js、css压缩优化工具介绍(配合小强视频 前端性能分析精要)
  8. 微信小游戏排行榜设计技术梳理
  9. day6 break continue for
  10. exploration 和 exploitation 的区别