Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录


Posted in Python onSeptember 13, 2018

简介:

MongoEngine 是一个Document-Object Mapper (想一下ORM, 但它是针对文档型数据库),Python通过它与MongoDB交互。你可能会说那PyMongo也是ORM啊,在Python中一切都是对象,但我们所说的ORM中的Object在指Python中的自定义类,而不是内置类型。MongoEngine或MongoKit将MongoDB的数据映射成自定义类实例,它们都是基于PyMongo的。
我们可以跟关系型数据库的Python客户端MySQLdb,以及ORM SQLAlchemy/Django ORM比较一下,PyMongo相当于MySQLdb,MongoEngine相当于SQLAlchemy,SQLAlchemy是基于MySQLdb之上的,MongoEngine是基于PyMongo的。

pymongo来操作MongoDB数据库,但是直接把对于数据库的操作代码都写在脚本中,这会让应用的代码耦合性太强,而且不利于代码的优化管理

一般应用都是使用MVC框架来设计的,为了更好地维持MVC结构,需要把数据库操作部分作为model抽离出来,这就需要借助MongoEngine,MongoEngine提供的抽象是基于类的,创建的所有模型都是类
我们可以跟关系型数据库的Python客户端MySQLdb,以及ORM SQLAlchemy/Django ORM比较一下,PyMongo相当于MySQLdb,MongoEngine相当于SQLAlchemy,SQLAlchemy是基于MySQLdb之上的,MongoEngine是基于PyMongo的

安装

pip install mongoengine

使用

1.使用时先声明一个继承自MongoEngine.Document的类

在类中声明一些属性,相当于创建一个用来保存数据的数据结构,即数据已类似数据结构的形式存入数据库中,通常把这样的一些类都存放在一个脚本中,作为应用的Model模块

from mongoengine import *
connect('mydb', host='localhost', port=27017)
import datetime
class Users(Document):
 name = StringField(required=True, max_length=200)
 age = IntField(required=True)

users = Users.objects.all() #返回所有的文档对象列表
for u in users:
 print("name:",u.name,",age:",u.age)

2.保存文档

required:设置必须;

default:如果没有其他值给出使用指定的默认值

unique:确保集合中没有其他document有此字段的值相同

choices:确保该字段的值等于数组中的给定值之一

from mongoengine import *
connect('mydb', host='localhost', port=27017)
import datetime
class Users(Document):
 name = StringField(required=True, max_length=200)
 age = IntField(required=True)
user1 = Users(
 name='jack',
 age= 21
)
user1.save() 
print(user1.name)
user1.name = 'jack2'
user1.save()  
print(user1.name)

3.查询10=<年龄<30的,按姓名排列

from mongoengine import *
connect('mydb', host='localhost', port=27017)
import datetime
class Users(Document):
 name = StringField(required=True, max_length=200)
 age = IntField(required=True)
user_search = Users.objects(age__gte=10, age__lt=33).order_by('name')
for u in user_search:
 print("name:",u.name,",age:",u.age)

查询10=<年龄<30的,按姓名倒序

from mongoengine import *
connect('mydb', host='localhost', port=27017)
import datetime
class Users(Document):
 name = StringField(required=True, max_length=200)
 age = IntField(required=True)
user_search = Users.objects(age__gte=10, age__lt=33).order_by('-name')
for u in user_search:
 print("name:",u.name,",age:",u.age)

查询name=jack2

from mongoengine import *
connect('mydb', host='localhost', port=27017)
import datetime
class Users(Document):
 name = StringField(required=True, max_length=200)
 age = IntField(required=True)

tmp = Users.objects(name="jack2")
for u in tmp:
 print("name:",u.name,",age:",u.age)

4.修改name=jack2 的age加1

from mongoengine import *
connect('mydb', host='localhost', port=27017)
import datetime
class Users(Document):
 name = StringField(required=True, max_length=200)
 age = IntField(required=True)
tmp = Users.objects(name="jack3").update(inc__age=1)
tmp = Users.objects(name="jack3")
for u in tmp:
 print("name:",u.name,",age:",u.age)

修改name=jack的age设为66

from mongoengine import *
connect('mydb', host='localhost', port=27017)
import datetime
class Users(Document):
 name = StringField(required=True, max_length=200)
 age = IntField(required=True)

tmp = Users.objects(name="jack").update(set__age=66)
tmp = Users.objects(name="jack")
for u in tmp:
 print("name:",u.name,",age:",u.age)

高级查询

例如有时候你需要将约束条件进行与,或的操作。你可以使用mongoengine提供的 Q 类来实现,一个 Q 类代表了一个查询的一部分,里面的参数设置与你查询document的时候相同。建立一个复杂查询的时候,你需要用 & 或 | 操作符将 Q 对象连结起来,例子如下:

Post.objects(Q(name="jack") | Q(age=66))

查询相关操作符

ne ? 不等于
lt ? 小于
lte ? 小于等于
gt ? 大于
gte ? 大于等于
not ? 使其检查的反面,需要使用在其他操作符之前(e.g. Q(age__not__mod=5))
in ? 值在list里面
nin ? 值不在list里面
mod ? value % x == y
all ? list里面所有的值
size ? 这个array的大小
exists ? 存在这个值
#一下操作符在需要进行正则检查的时候是比较快捷的方法:
exact ? 字符串型字段完全匹配这个值
iexact ? 字符串型字段完全匹配这个值(大小写敏感)
contains ? 字符串字段包含这个值
icontains ?字符串字段包含这个值(大小写敏感)
startswith ? 字符串字段由这个值开头
istartswith ?字符串字段由这个值开头(大小写敏感)
endswith ? 字符串字段由这个值结尾
iendswith ?字符串字段由这个值结尾(大小写敏感)
match ? 使你可以使用一整个document与数组进行匹配查询list

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python实现在线程里运行scrapy的方法
Apr 07 Python
在Python的Flask框架中使用模版的入门教程
Apr 20 Python
python排序方法实例分析
Apr 30 Python
python将unicode转为str的方法
Jun 21 Python
使用python和Django完成博客数据库的迁移方法
Jan 05 Python
利用python循环创建多个文件的方法
Oct 25 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
Dec 25 Python
利用python绘制数据曲线图的实现
Apr 09 Python
Django+RestFramework API接口及接口文档并返回json数据操作
Jul 12 Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 Python
Python使用eval函数执行动态标表达式过程详解
Oct 17 Python
python3中确保枚举值代码分析
Dec 02 Python
python中字符串内置函数的用法总结
Sep 13 #Python
浅析python继承与多重继承
Sep 13 #Python
Python中分支语句与循环语句实例详解
Sep 13 #Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 #Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 #Python
Python爬虫常用小技巧之设置代理IP
Sep 13 #Python
python集合比较(交集,并集,差集)方法详解
Sep 13 #Python
You might like
利用php来自动调用不同服务器上的flash
2006/10/09 PHP
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
js 屏蔽鼠标右键脚本附破解方法
2009/12/03 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
Javascript下拉刷新的简单实现
2017/02/14 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
Vue实现移动端左右滑动效果的方法
2018/11/27 Javascript
ES6入门教程之let、const的使用方法
2019/04/13 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
python素数筛选法浅析
2018/03/19 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
tensorflow 获取变量&amp;打印权值的实例讲解
2018/06/14 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
Apache,wsgi,django 程序部署配置方法详解
2019/07/01 Python
Django  ORM 练习题及答案
2019/07/19 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
Python urllib2运行过程原理解析
2020/06/04 Python
Python 使用office365邮箱的示例
2020/10/29 Python
地球上最先进的胡子和头发修剪器:Bevel
2018/01/23 全球购物
Java中实现多态的机制
2015/08/09 面试题
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
售房协议书范本
2015/08/11 职场文书
2019预备党员转正申请书模板2篇!
2019/08/07 职场文书