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


Posted in Python onJuly 01, 2019

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

1. 安装Mongodb和pymongo

Mongodb的安装和配置

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

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

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

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

1.2 分别执行命令:

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

mongod --port 27017 --dbpath /data/db
mongo --port 27017

1.3 安装pymongo

sudo pip3 install pymongo

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

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

import pymongo
#连接mongodb
client = 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 pymongo
from bson.objectid import ObjectId
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = 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 pymongo
from bson.objectid import ObjectId
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = db.students
#修改
condition = {'name': 'Jack'}
student = collection.find_one(condition) #获得满足condition的数据
print('更新前: ', student)
student['age'] = 22 #修改年龄
result = collection.update(condition, student) #将修改后的student替换condition
print('更新后', 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 pymongo
from bson.objectid import ObjectId
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = 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 pymongo
from bson.objectid import ObjectId
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = 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替换condition
print('更新后', 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替换condition
print('更新后', 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 pymongo
from bson.objectid import ObjectId
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = 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 3
12345678910
{‘age': {'$gt': 20}}为查找年龄大于20的, {‘inc': {‘age': 1}}为将年龄+1

5. 删除:

import pymongo
from bson.objectid import ObjectId
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = 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生成pdf文件的方法
Aug 04 Python
pandas进行数据的交集与并集方式的数据合并方法
Jun 27 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
python将类似json的数据存储到MySQL中的实例
Jul 12 Python
Python Django切换MySQL数据库实例详解
Jul 16 Python
django中上传图片分页三级联动效果的实现代码
Aug 30 Python
Python装饰器使用你可能不知道的几种姿势
Oct 25 Python
Python如何通过Flask-Mail发送电子邮件
Jan 29 Python
Jupyter Notebook远程登录及密码设置操作
Apr 10 Python
Python3实现飞机大战游戏
Apr 24 Python
Pycharm配置lua编译环境过程图解
Nov 28 Python
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
Jun 03 Python
Python字典对象实现原理详解
Jul 01 #Python
Python Pandas 获取列匹配特定值的行的索引问题
Jul 01 #Python
Python动态语言与鸭子类型详解
Jul 01 #Python
详解python websocket获取实时数据的几种常见链接方式
Jul 01 #Python
使用python将mysql数据库的数据转换为json数据的方法
Jul 01 #Python
python字符串Intern机制详解
Jul 01 #Python
简单了解python单例模式的几种写法
Jul 01 #Python
You might like
PHP判断远程图片是否存在的几种方法
2014/05/04 PHP
php实现复制移动文件的方法
2015/07/29 PHP
PHP解决中文乱码
2017/04/28 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
2017/08/04 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
javascript css styleFloat和cssFloat
2010/03/15 Javascript
Package.js  现代化的JavaScript项目make工具
2012/05/23 Javascript
jquery foreach使用示例
2013/09/12 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
2015/11/17 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
利用Angular.js限制textarea输入的字数
2016/10/20 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
Vue的路由动态重定向和导航守卫实例
2018/03/17 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
原生JavaScript实现进度条
2021/02/19 Javascript
python实现rest请求api示例
2014/04/22 Python
python保存数据到本地文件的方法
2018/06/23 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
海外淘书首选:AbeBooks
2017/07/31 全球购物
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
欧克利英国官网:Oakley英国
2019/08/24 全球购物
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
语文教育专业应届生求职信
2013/11/23 职场文书
建筑工程毕业生自我鉴定
2014/01/14 职场文书
组织关系转移介绍信
2014/01/16 职场文书
毕业生就业意向书
2014/04/01 职场文书
计算机求职信
2014/07/02 职场文书
食品安全演讲稿
2014/09/01 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书
pytorch MSELoss计算平均的实现方法
2021/05/12 Python