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中yield关键词的作用与用法
Nov 29 Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
Dec 07 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 Python
python中正则表达式与模式匹配
May 07 Python
python读取并定位excel数据坐标系详解
Jun 26 Python
浅析Python 引号、注释、字符串
Jul 25 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
Mar 25 Python
Tensorflow tf.tile()的用法实例分析
May 22 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
改变 Python 中线程执行顺序的方法
Sep 24 Python
scrapy头部修改的方法详解
Dec 06 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
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
JavaScript Promise启示录
2014/08/12 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
深入浅析JavaScript中的scrollTop
2016/07/11 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
利用JQuery实现datatables插件的增加和删除行功能
2017/01/06 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
基于Three.js实现360度全景图片
2018/12/30 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
js实现继承的方法及优缺点总结
2019/05/08 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
python数字图像处理之高级形态学处理
2018/04/27 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
python脚本开机自启的实现方法
2019/06/28 Python
python3 深浅copy对比详解
2019/08/12 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
先进个人获奖感言
2014/01/24 职场文书
班级文化建设标语
2014/06/23 职场文书
毕业生应聘求职信
2014/07/10 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python