Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录

简介:

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Python中的MongoDB基本操作:连接、查询实例

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案.它的特点是高性能.易部署.易使用,存储数据非常方便. MongoDB 简单使用 联接数据库 复制代码 代码如下: In [1]: import pymongo In [2]: from pymongo import Connection In [3]: connection = Connection('192.168.1.3', 27017) //创建联接 Connection

  • 在Python中使用mongoengine操作MongoDB教程

    最近重新拾起Django,但是Django并不支持mongodb,但是有一个模块mongoengine可以实现Django Model类似的封装.但是mongoengine的中文文档几乎没有,有的也是简短的几句介绍和使用.下面我就分享一下我在使用过程中所记录下的一些笔记,可能有点乱.大家可以参考一下. 安装mongoengine easy_install pymongo # 依赖库 easy_install mongoengine 基本使用 from mongoengine import * f

  • Python中使用Flask、MongoDB搭建简易图片服务器

    1.前期准备 通过 pip 或 easy_install 安装了 pymongo 之后, 就能通过 Python 调教 mongodb 了. 接着安装个 flask 用来当 web 服务器. 当然 mongo 也是得安装的. 对于 Ubuntu 用户, 特别是使用 Server 12.04 的同学, 安装最新版要略费些周折, 具体说是 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 echo '

  • python操作MongoDB基础知识

    首先运行easy_install pymongo命令安装pymongo驱动.然后执行操作:创建连接 复制代码 代码如下: In [1]: import pymongoIn [2]: connection = pymongo.Connection('localhost', 27017) 切换到数据库malware 复制代码 代码如下: In [3]: db = connection.malware 获取collection 复制代码 代码如下: In [4]: collection = db.ma

  • python连接mongodb操作数据示例(mongodb数据库配置类)

    一.相关代码数据库配置类 MongoDBConn.py 复制代码 代码如下: #encoding=utf-8''' Mongo Conn连接类''' import pymongo class DBConn:    conn = None    servers = "mongodb://localhost:27017" def connect(self):        self.conn = pymongo.Connection(self.servers) def close(self

  • Python的MongoDB模块PyMongo操作方法集锦

    开始之前当然要导入模块啦: >>> import pymongo 下一步,必须本地mongodb服务器的安装和启动已经完成,才能继续下去. 建立于MongoClient 的连接: client = MongoClient('localhost', 27017) # 或者 client = MongoClient('mongodb://localhost:27017/') 得到数据库: >>> db = client.test_database # 或者 >>

  • win系统下为Python3.5安装flask-mongoengine 库

    环境: windows 10.python 3.5.flask-mongoengine 0.8.2或0.9.0 使用以下命令安装 flask-mongoengine pip install flask-mongoengine 会出现以下错误: 复制代码 代码如下: flask-mongoengine-0.8.2\setup.py", line 10, in <module> UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6

  • Python操作MongoDB数据库PyMongo库使用方法

    引用PyMongo 复制代码 代码如下: >>> import pymongo 创建连接Connection 复制代码 代码如下: >>> import pymongo >>> conn = pymongo.Connection('localhost',27017) 或 复制代码 代码如下: >>> from pymongo import Connection >>> conn = Connection('local

  • 使用Python脚本操作MongoDB的教程

    连接数据库 MongoClient VS Connection class MongoClient(pymongo.common.BaseObject) | Connection to MongoDB. | | Method resolution order: | MongoClient | pymongo.common.BaseObject | __builtin__.object | class Connection(pymongo.mongo_client.MongoClient) | C

  • Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录

    简介: MongoEngine 是一个Document-Object Mapper (想一下ORM, 但它是针对文档型数据库),Python通过它与MongoDB交互.你可能会说那PyMongo也是ORM啊,在Python中一切都是对象,但我们所说的ORM中的Object在指Python中的自定义类,而不是内置类型.MongoEngine或MongoKit将MongoDB的数据映射成自定义类实例,它们都是基于PyMongo的. 我们可以跟关系型数据库的Python客户端MySQLdb,以及ORM

  • Python 利用flask搭建一个共享服务器的步骤

    零.概述 我利用flask搭建了一个简易的共享服务器,分享给大家 一.python代码 import os import time from flask import Flask,render_template,url_for,redirect,send_from_directory # 共享文件夹的根目录 rootdir = r'C:\Users\Administrator\Downloads\zlkt'   app = Flask(__name__)   @app.route('/doc/'

  • C#简单操作MongoDB的步骤全纪录

    前言 MongoDB是一款由C++编写的高性能.开源.无模式的常用非关系型数据库产品,是非关系数据库当中功能最丰富.最像关系数据库的数据库.它扩展了关系型数据库的众多功能,例如:辅助索引.范围查询.排序等. MongoDB主要解决的是海量数据的访问效率问题,它作为分布式数据崛起后,使用较多的一款非结构数据库,必然有其值得称道之处,它的主要功能特性如下: 1)面向集合的存储,适合存储对象及JSON形式的数据. 2)动态查询,MongoDB支持丰富的查询表达式.查询指令使用JSON形式的标记,可轻易

  • Spring Boot整合MyBatis连接Oracle数据库的步骤全纪录

    前言 本文主要分享了Spring Boot整合MyBatis连接Oracle数据库的相关内容,下面话不多说了,直接来详细的步骤吧. 步骤如下: 1.Spring Boot项目添加MyBatis依赖和Oracle驱动: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <ver

  • Postgresql开启远程访问的步骤全纪录

    前言 安装PostgreSQL数据库之后,默认是只接受本地访问连接.如果想在其他主机上访问PostgreSQL数据库服务器,就需要进行相应的配置.下面话不多说了,来一起看看详细的介绍吧. 步骤如下: 要在Postgresql中允许远程访问,需要设置如下2个文件: postgresql.conf pg_hba.conf 然而由于系统安装的是Centos 7,而默认的Postgresql版本为9.2,于是安装了个9.6的版本,却发现在配置好远程无法访问.而默认的路径是找不到上述2个文件的,此时可以通

  • golang解析域名的步骤全纪录

    最近遇到了一个问题. 我们的kube-apiserver配置了OIDC认证,OIDC issuer是添加了dns server记录的,但由于某些原因,我需要覆盖掉dns server的解析,改用hostAlias的IP地址,但是实测发现总是走了DNS解析,虽然/etc/hosts文件已经添加了自定义的hosts记录.而那些没有在dns server注册的域名,还是可以通过 /etc/hosts 解析的. 原因是,kube-apiserver的基础镜像是 busybox ,和 centos 不同,

  • 构建多模块的Spring Boot项目步骤全纪录

    前言 众所周知,在多个项目中可能会相同的模块,如果每个项目都去创建一遍的话,这样开发效率会很低.比如在开发一个APP应用的时候,有供APP使用的接口项目.后台管理系统,两个项目共用一套数据库,分开的话需要配置多次mybatis,如果有些表需要改动的话,则都需要改动,所以使用多模块管理这些模块的话,会非常的方便. 通过阅读本文你将了解到:如何将已有SpringBoot项目改成多模块 & 如何新构建多模块SpringBoot项目 以下示例基于我正在使用的order(订单服务)进行演示,无论你用的是什

  • java导出Excel文件的步骤全纪录

    一.背景 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际的开发中,很多时候需要实现导入.导出Excel的应用. 最近在java上做了一个EXCEL的导出功能,写了一个通用类,在这里分享分享,该类支持多sheet,且无需手动进行复杂的类型转换,只需提供三个参数即可: 1.fileName excel文件名 2.HasMap<String,List<?&g

  • Angular项目如何升级至Angular6步骤全纪录

    前言 前段时间将所负责的 Angular2 项目升级到了 Angular5 版本,这两天又进行了升级至 Angular6 的尝试.总的来说,两次升级过程比较类似,也不算复杂. 2018年5月4日,Angular6.0.0版正式发布,新版本主要关注底层框架和工具链,目的在于使其变得更小更快. 特性的小改动: animations: 只能使用 WA-polyfill 和 AnimationBuilder animations: 在转换匹配器中暴露元素和参数 common: 在 NgIf 中使用非模板

  • python利用元类和描述器实现ORM模型的详细步骤

    ORM模型: ORM模型对于后端开发来说肯定是不陌生的,包括很多后端框架比如django,现在都自带这个模型了 ORM(Object Relational Mapping)对象关系映射 Python中的类与数据库之间的映射,对数据的操作就不用编写SQL语言了,因为都封装好了,比如你想插入一条数据,你就直接创建一个对象即可, 类名 ------->>>> 数据库中的表名 属性 ------->>>> 数据库中的字段 对象 ------->>>

随机推荐