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实现排序算法解析
Sep 08 Python
Python3实现的判断环形链表算法示例
Mar 07 Python
浅谈python之高阶函数和匿名函数
Mar 21 Python
基于Django静态资源部署404的解决方法
Jul 28 Python
python实现对图片进行旋转,放缩,裁剪的功能
Aug 07 Python
使用OpenCV实现仿射变换—平移功能
Aug 29 Python
Python调用.NET库的方法步骤
Dec 27 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
python2 对excel表格操作完整示例
Feb 23 Python
python实现遍历文件夹图片并重命名
Mar 23 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
python识别围棋定位棋盘位置
Jul 26 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中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
原生javascript兼容性测试实例
2013/07/01 Javascript
固定网页背景图同时保持图片比例的思路代码
2013/08/15 Javascript
Javascript弹出窗口的各种方法总结
2013/11/11 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
2014/05/09 Javascript
JavaScript DOM操作表格及样式
2015/04/13 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
微信JS接口大全
2016/08/25 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
Django中login_required装饰器的深入介绍
2017/11/24 Python
python3+dlib实现人脸识别和情绪分析
2018/04/21 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
2020/12/23 Python
护理专业学生职业生涯规划范文
2014/03/11 职场文书
自我鉴定书
2014/03/24 职场文书
大学生求职计划书
2014/04/30 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
2015年学校财务工作总结
2015/05/19 职场文书
2016党员干部廉政准则学习心得体会
2016/01/20 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书
JavaScript实现简单图片切换
2021/04/29 Javascript
CSS filter 有什么神奇用途
2021/05/25 HTML / CSS
使用python创建股票的时间序列可视化分析
2022/03/03 Python