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生成器实现微线程编程的教程
Apr 13 Python
python实现kMeans算法
Dec 21 Python
解决Pycharm出现的部分快捷键无效问题
Oct 22 Python
详解程序意外中断自动重启shell脚本(以Python为例)
Jul 26 Python
pytorch多GPU并行运算的实现
Sep 27 Python
pytorch中tensor张量数据类型的转化方式
Dec 31 Python
python pprint模块中print()和pprint()两者的区别
Feb 10 Python
python不到50行代码完成了多张excel合并的实现示例
May 28 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
序列化Python对象的方法
Aug 01 Python
Python Celery异步任务队列使用方法解析
Aug 10 Python
Python数据分析库pandas高级接口dt的使用详解
Dec 11 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预定义常量
2006/12/25 PHP
PHP chmod 函数与批量修改文件目录权限
2010/05/10 PHP
file_get_contents(&quot;php://input&quot;, &quot;r&quot;)实例介绍
2013/07/01 PHP
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
php实现cookie加密的方法
2015/03/10 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
PHP精确计算功能示例
2016/11/29 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
取得父标签
2006/11/14 Javascript
HTML中Select不用Disabled实现ReadOnly的效果
2008/04/07 Javascript
js post方式传递提交的实现代码
2010/05/31 Javascript
利用JQuery和JS实现奇偶行背景颜色自定义效果
2012/11/19 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
jQuery插件jFade实现鼠标经过的图片高亮其它变暗
2015/03/14 Javascript
React Native中TabBarIOS的简单使用方法示例
2017/10/13 Javascript
全面了解JavaScript的作用域链
2019/04/03 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
JavaScript实现点击自制菜单效果
2021/02/02 Javascript
在Python中os.fork()产生子进程的例子
2019/08/08 Python
Python continue语句实例用法
2020/02/06 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
Python自带的IDE在哪里
2020/07/01 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
Django 实现图片上传和下载功能
2020/12/31 Python
Python截图并保存的具体实例
2021/01/14 Python
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
高三高考决心书
2014/03/11 职场文书
2015年公司工作总结
2015/04/25 职场文书
张思德观后感
2015/06/09 职场文书
如何使用pdb进行Python调试
2021/06/30 Python