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实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
Jan 18 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
python爬取网易云音乐评论
Nov 16 Python
python爬虫获取百度首页内容教学
Dec 23 Python
python 反编译exe文件为py文件的实例代码
Jun 27 Python
python对象转字典的两种实现方式示例
Nov 07 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
Feb 27 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
May 15 Python
python如何对链表操作
Oct 10 Python
Python selenium绕过webdriver监测执行javascript
Apr 12 Python
 python中的元类metaclass详情
May 30 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
制作美丽的拉花
2021/03/03 冲泡冲煮
初学CAKEPHP 基础教程
2009/11/02 PHP
Apache服务器无法使用的解决方法
2013/05/08 PHP
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
php生成HTML文件的类方法
2019/10/11 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
JavaScript简介
2015/02/15 Javascript
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
python使用Tkinter显示网络图片的方法
2015/04/24 Python
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
Python中的默认参数详解
2015/06/24 Python
python回调函数中使用多线程的方法
2017/12/25 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
Python3.5 处理文本txt,删除不需要的行方法
2018/12/10 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
django解决订单并发问题【推荐】
2019/07/31 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
2014年乡镇植树节活动方案
2014/02/28 职场文书
父母对孩子说的话
2014/04/12 职场文书
公司年终奖分配方案
2014/06/16 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
青春雷锋观后感
2015/06/10 职场文书