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解析网页源代码中的115网盘链接实例
Sep 30 Python
python实现合并两个数组的方法
May 16 Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 Python
python中使用%与.format格式化文本方法解析
Dec 27 Python
linux环境下Django的安装配置详解
Jul 22 Python
微信小程序python用户认证的实现
Jul 29 Python
PyQt5实现暗黑风格的计时器
Jul 29 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
Oct 30 Python
Python笔记之工厂模式
Nov 20 Python
python实现梯度下降法
Mar 24 Python
python--shutil移动文件到另一个路径的操作
Jul 13 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
Sep 05 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
也谈截取首页新闻 - 范例
2006/10/09 PHP
PHP session有效期session.gc_maxlifetime
2011/04/20 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
js几秒以后倒计时跳转示例
2013/12/26 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
详解Vue 事件驱动和依赖追踪
2017/04/22 Javascript
微信小程序-getUserInfo回调的实例详解
2017/10/27 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
python中的随机函数random的用法示例
2018/01/27 Python
pandas按若干个列的组合条件筛选数据的方法
2018/04/11 Python
python库lxml在linux和WIN系统下的安装
2018/06/24 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
Django中间件基础用法详解
2019/07/18 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
Python之Sklearn使用入门教程
2021/02/19 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
数组越界问题
2015/10/21 面试题
2014年新生军训方案
2014/05/01 职场文书
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
解除劳动合同协议书
2014/09/17 职场文书
出资证明书范本(标准版)
2014/09/24 职场文书
个人创业事迹材料
2014/12/30 职场文书
财务工作失误检讨书
2015/02/19 职场文书
个人工作能力自我评价
2015/03/05 职场文书
嵌入式Redis服务器在Spring Boot测试中的使用教程
2021/07/21 Redis
Java实现注册登录跳转
2022/06/16 Java/Android