侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

浅析Python与Mongodb数据库之间的操作方法

Python  /  管理员 发布于 7年前   192

MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。

1. 安装Mongodb和pymongo

Mongodb的安装和配置

Mongodb的安装教程请网上搜索, 安装完成后,    进行以下配置过程:

1.1 创建目录, 该目录为Mongodb数据文件的存放目录:

*注: 本人使用的不是root用户, 所以修改目录的拥有者. *

sudo mkdir /datasudo chown -R python:python /datamkdir /data/db

1.2 分别执行命令:

第一条命令为指定端口和保存路径, 第二条为运行mongodb数据库.

mongod --port 27017 --dbpath /data/dbmongo --port 27017

1.3 安装pymongo

sudo pip3 install pymongo

2. 连接数据库、指定数据库、指定集合、插入数据:

mongodb存储数据以键值形式, 因此在Python中使用字段插入数据.

import pymongo#连接mongodbclient = pymongo.MongoClient('mongodb://localhost:27017/')#指定数据库db = client.test4#指定集合collection = db.students#数据student1 = { 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}student2 = { 'id': '201802', 'name': 'Tom', 'age': 22, 'gender': 'male'}student3 = { 'id': '201803', 'name': 'Rose', 'age': 21, 'gender': 'female'}student4 = { 'id': '201804', 'name': 'Mike', 'age': 20, 'gender': 'female'}student5 = { 'id': '201805', 'name': 'Ray', 'age': 20, 'gender': 'female'}student6 = { 'id': '201806', 'name': 'Alan', 'age': 21, 'gender': 'male'}#插入一条数据result1 = collection.insert_one(student1)print(result1)print(result1.inserted_id)# #插入多条数据result2 = collection.insert_many([student2, student3, student4, student5, student6])print(result2)print(result2.inserted_ids)

运行结果:

insert方法:

5b3a1942971951218d41c02b
[ObjectId('5b3a1942971951218d41c02c'), ObjectId('5b3a1942971951218d41c02d')]

官方推荐:

<pymongo.results.InsertOneResult object at 0x7fa4cc363ec8>5b3a1942971951218d41c02e<pymongo.results.InsertManyResult object at 0x7fa4cc363f08>[ObjectId('5b3a1942971951218d41c02f'), ObjectId('5b3a1942971951218d41c030')]

3. 查询、计数、排序、偏移:

import pymongofrom bson.objectid import ObjectIdclient = pymongo.MongoClient('mongodb://localhost:27017/')db = client.test4collection = db.students#查询一条数据print('单条数据','='*50)result = collection.find_one({'name': 'Jack'})print(result)print('多条数据','='*50)#查询多条数据for res in collection.find({'age': {'$mod': [5, 0]}}): print(res)#计数print('计数','='*50)count = collection.find({'age': {'$mod': [5, 0]}}).count()print(count)#排序print('排序','='*50)results = collection.find().sort('name', pymongo.ASCENDING) #升序, pymongo.DESCENDING为降序print([result['name'] for result in results])#偏移print('偏移','='*50)results = collection.find().sort('name', pymongo.ASCENDING).skip(2) #偏移2位,忽略前两个数据print([result['name'] for result in results])results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2) #只输出2个数据print([result['name'] for result in results])find({‘age': {'$mod': [5, 0]}}): 表示查找年龄取余5余0的值. 还有很多比较符号, 请百度.

运行结果:

单条数据 =================================================={'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}多条数据 =================================================={'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}{'_id': ObjectId('5b3a1942971951218d41c02e'), 'id': '201804', 'name': 'Mike', 'age': 20, 'gender': 'female'}{'_id': ObjectId('5b3a1942971951218d41c02f'), 'id': '201805', 'name': 'Ray', 'age': 20, 'gender': 'female'}计数 ==================================================3排序 ==================================================['Alan', 'Jack', 'Mike', 'Ray', 'Rose', 'Tom']偏移 ==================================================['Mike', 'Ray', 'Rose', 'Tom']['Mike', 'Ray']

4. 更新:

4.1  不使用$set更新数据:

import pymongofrom bson.objectid import ObjectIdclient = pymongo.MongoClient('mongodb://localhost:27017/')db = client.test4collection = db.students#修改condition = {'name': 'Jack'}student = collection.find_one(condition) #获得满足condition的数据print('更新前: ', student)student['age'] = 22 #修改年龄result = collection.update(condition, student) #将修改后的student替换conditionprint('更新后', collection.find_one(condition))#更新的返回值print(result) #ok=1代表执行成功, nModified代表影响的条数

运行结果:

更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 22, 'gender': 'male'}{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}

4.2  使用$set更新数据:

import pymongofrom bson.objectid import ObjectIdclient = pymongo.MongoClient('mongodb://localhost:27017/')db = client.test4collection = db.students#使用$set更新condition = {'name': 'Jack'}student = collection.find_one(condition) #获得满足condition的数据print('更新前: ', student)student['age'] = 23 #修改年龄result = collection.update(condition, {'$set': student}) #将修改后的student替换condition, $set为重点print('更新后', collection.find_one(condition))#更新的返回值print(result) #ok=1代表执行成功, nModified代表影响的条数

运行结果:

更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 22, 'gender': 'male'}更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 23, 'gender': 'male'}{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}

比较使用和不适用$set更新数据, 发现此时并没有什么区别.

下面介绍区别所在:

4.3  区别

import pymongofrom bson.objectid import ObjectIdclient = pymongo.MongoClient('mongodb://localhost:27017/')db = client.test4collection = db.students#使用和不使用$set更新的区别print('使用: ')condition = {'name': 'Jack'}student = collection.find_one(condition) #获得满足condition的数据print('更新前: ', student)student = { 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'mother': "Jack's mother"}result = collection.update(condition, {'$set': student}) #将修改后的student替换conditionprint('更新后', collection.find_one(condition))#更新的返回值print(result) #ok=1代表执行成功, nModified代表影响的条数#分割线print()print('='*20, '分割线', '='*20)print()print('不使用: ')condition = {'name': 'Jack'}student = collection.find_one(condition) #获得满足condition的数据print('更新前: ', student)student = { 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'father': "Jack's father"}result = collection.update(condition, student) #将修改后的student替换conditionprint('更新后', collection.find_one(condition))#更新的返回值print(result) #ok=1代表执行成功, nModified代表影响的条数

运行结果:

使用:

更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 23, 'gender': 'male'}更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'mother': "Jack's mother"}{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}

==================== 分割线 ====================

不使用: 更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'mother': "Jack's mother"}更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'father': "Jack's father"}{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}

分析上面运行结果, 可以发现使用$set时, 若更新数据有原数据没有的字段, 则将该字段加到原数据上(上例为新增了mother字段), 而不会删除任何字段. 相反, 若不使用set时, 将从原数据中删除更新数据没有的字段, 再加上新增字段(上例为删除了mother字段, 新增了father字段. 也可以理解为将原数据完全替换为更新数据)

4.4  update_one和update_many的区别:

import pymongofrom bson.objectid import ObjectIdclient = pymongo.MongoClient('mongodb://localhost:27017/')db = client.test4collection = db.students#官方推荐使用#update_one和update_many的区别print('update_one: ')condition = {'age': {'$gt': 20}}result = collection.update_one(condition, {'$inc': {'age': 1}})print(result)print(result.matched_count, result.modified_count)#分割线print()print('='*20, '分割线', '='*20)print()print('update_many: ')condition = {'age': {'$gt': 20}}result = collection.update_many(condition, {'$inc': {'age': 1}})print(result)print(result.matched_count, result.modified_count)

运行结果:

update_one: <pymongo.results.UpdateResult object at 0x7f6cace0f9c8>1 1==================== 分割线 ====================update_many: <pymongo.results.UpdateResult object at 0x7f6cace0fa88>3 312345678910{‘age': {'$gt': 20}}为查找年龄大于20的, {‘inc': {‘age': 1}}为将年龄+1

5. 删除:

import pymongofrom bson.objectid import ObjectIdclient = pymongo.MongoClient('mongodb://localhost:27017/')db = client.test4collection = db.students#删除result = collection.remove({'name': 'Jack'})print(result)#推荐使用result = collection.delete_one({'age': {'$gt': 20}})print(result.deleted_count)result = collection.delete_many({'age': {'$gt': 20}})print(result.deleted_count)

运行结果:

{'ok': 1, 'n': 1}
1
2

6. 其他

除了上述常用的之外, 还包括find_one_and_delete()查找后删除、find_one_and_replace()查找后替换, 有兴趣可以百度深入了解.

总结

以上所述是小编给大家介绍的Python与Mongodb数据库之间的操作方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!


  • 上一条:
    Python为何不能用可变对象作为默认参数的值
    下一条:
    Python字典对象实现原理详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客