简介:

MongoEngine是一个对象文档映射器(ODM),相当于一个基于SQL的对象关系映射器(ORM)

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使用ORM控制MongoDB(MongoEngine)的更多相关文章

  1. 在Python应用中使用MongoDB

    Python是开发社区中用于许多不同类型应用的强大编程语言.很多人都知道它是可以处理几乎任何任务的灵活语言.因此,在Python应用中需要一个什么样的与语言本身一样灵活的数据库呢?那就是NoSQL,比 ...

  2. Python操作MySQL+Redis+MongoDB

    1-1 python操作三大主流数据库导学篇 1-2 数据库简介 1-3 MySQL简介 2-1 MySQL安装及配置 2-2 MySQL图形化管理工具 2-3 SQL语法基础-创建并使用数据库 2- ...

  3. 使用Python 将shapefile导入mongodb

    使用Python 将shapefile导入mongodb 随着big data时代的到来,各个行业都在考虑能不能把big data的思路.方法引入进来,GIS行业也不能免俗. 下面就介绍一下如何将sh ...

  4. Python MySQL ORM QuickORM hacking

    # coding: utf-8 # # Python MySQL ORM QuickORM hacking # 说明: # 以前仅仅是知道有ORM的存在,但是对ORM这个东西内部工作原理不是很清楚, ...

  5. python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查

    python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...

  6. Python 使用pymongo操作mongodb库

    Python 使用pymongo操作mongodb库 2016-12-31 21:55 1115人阅读 评论(0) 收藏 举报  分类: - - - Python(10)  版权声明:本文为博主原创文 ...

  7. Python手势识别与控制

    代码地址如下:http://www.demodashi.com/demo/12968.html Python手势识别与控制 概述 本文中的手势识别与控制功能主要采用 OpenCV 库实现, OpenC ...

  8. Python实时语音识别控制

    代码地址如下:http://www.demodashi.com/demo/12946.html Python实时语音识别控制 概述 本文中的语音识别功能采用 百度语音识别库 ,首先利用 PyAudio ...

  9. ROS Learning-029 (提高篇-007 A Mobile Base-05) 控制移动平台 --- (Python编程)控制虚拟机器人的移动(精确的制定目标位置)

    ROS 提高篇 之 A Mobile Base-05 - 控制移动平台 - (Python编程)控制虚拟机器人的移动(精确的制定目标位置) 使用 odometry 消息类型 重写 out_and_ba ...

随机推荐

  1. 解决git commit报错问题

    参考: https://stackoverflow.com/questions/3239274/git-commit-fails-due-to-insufficient-permissions 问题 ...

  2. mysql ibd 文件过大问题

    公司的数据库挂了查了下 ,每个表都有自己独立的表空间,有一张表的ibd 文件有好几G了.然后想要释放它. 解决方案: 第一种,删除表,然后重新建.drop table 操作自动回收表空间 第二种,al ...

  3. (转)io各层次性能汇总及运行速度对比

    io各层次性能汇总:以上图片可以清晰的解释io的运行效率 守护进程:持续保持运行着的程序 进程:放在内存中运行的程序 程序:代码文件,php,java

  4. JS filter使用

    filter 用于筛选数组中符合条件的所以元素,filter只能接受函数 注意:filter只返回筛选结果,不会对原来数组改变 实现方法: <html lang="en"&g ...

  5. C# 操作 sqlite

    1.下载sqlite:http://system.data.sqlite.org/downloads/1.0.94.0/sqlite-netFx20-setup-bundle-x86-2005-1.0 ...

  6. Collections集合工具类,集合嵌套,集合综合案例斗地主

    1 Collections集合工具类 (可以对比Arrays工具类共同记忆) 常用方法: 例: import java.util.ArrayList; import java.util.Collect ...

  7. http://www.ibm.com/developerworks/cn/web/wa-lo-firefox-ext/index.html

    <html>    <head>        <style>                textarea{                width:800p ...

  8. 深度探索C++对象模型——关于对象

    引言 以前读<C++ Primer>的时候一直有一种感觉:该书虽然是C++入门书籍,初学者读之却觉晦涩,越往后读越是如此.等到稍加理解后再读该书,顿感醍醐灌顶,茅塞顿开.究其原因,在于原作 ...

  9. fpga Verilog hdl 按键消抖 部分程序讲解

    module debounce(clk_in,rst_in,key_in,key_pulse,key_state); input clk_in;//system clock input rst_in; ...

  10. 2017.10.5 QBXT 模拟赛

    题目链接 T1 从小到大排序,用sum记录前缀和,然后枚举1~n个数 ,如果当前的前缀和 + 1小于a[i]的话 那么 sum + 1永远不可能拼出来 直接输出sum + 1 ,否则统计前缀和.最后如 ...