MongoEngine中⽂⽂档
MongoEngine中⽂⽂档
简介:
MongoEngine是⼀个基于pymongo开发的ODM库,对应与SQLAlchemy。同时,在MongoEngine基础上封装了Flask-MongoEngine,⽤于⽀持flask框架。
⼊门教程
1.安装MongoEngine
pip3 install mongoengine
2.连接⾄MongoDB
2.1 连接数据库
-2.11 ⽅法⼀
from mongoengine import connect
connect('dbname', alias='别名')
-2.12 ⽅法⼆
from mongoengine import connect
connect('dbname', host='远程服务器IP地址', post=开放的端⼝号)
-2.13 ⽅法三
from mongoengine import connect
connect('dbname', username='⽤户名', password='密码', authentication_source='admin', host='远程服务器IP地址', post=开放的端⼝号)
2.2 连接⾄副本
from mongoengine import connect
# Regular connect
connect('dbname', replicaset='rs-name')
# URI风格连接
connect(host='mongodb://localhost/dbname?replicaSet=rs-name')
2.3 连接⾄多个数据库
要使⽤多个数据库,您可以使⽤connect()并为连接提供别名(alisa),默认使⽤“default”。
在后台,这⽤于register_connection()存储数据,如果需要,您可以预先注册所有别名。
-2.31
通过在元数据中提供db_alias,可以将各个⽂档附加到不同的数据库。这允许DBRef 对象指向数据库和集合。下⾯是⼀个⽰例模式,使⽤3个不同的数据库来存储数据
connect (alias = 'user-db-alias' , db = 'user-db' )
connect (alias = 'book-db-alias' , db = 'book-db' )
connect (alias = 'users-books-db -alias' , db = 'users-books-db' )
class User (Document ):
name = StringField ()
meta = { 'db_alias' : 'user-db-alias' }
class Book(Document ):
name = StringField ()
meta = { 'db_alias' : 'book-db-alias' }
class AuthorBooks (Document ):
author = ReferenceField (User )
book = ReferenceField (Book )
meta = { 'db_alias' : ' users-books-db-alias' }
-2.32
该功能 disconnect() 可⽤于断开特定连接。这可⽤于全局更改连接:
from mongoengine import connect, disconnect
connect('a_db', alias='db1') # ==》建⽴别名为“db1”的连接
class User(Document):
name = StringField()
meta = {'db_alias': 'db1'}
disconnect(alias='db1') # ==》断开别名为“db1”的连接
connect('another_db', alias='db1') # ==》由于上⼀步断开了别名为db1的连接,现在连接其它数据库时⼜可以使⽤别名“db1”作为连接名2.4 上下⽂管理器 context_managers
有时您可能希望切换数据库或集合以进⾏查询
- 2.4.1 切换数据库
switch_db上允许更改数据库别名给定类,允许快速和⽅便地跨数据库访问:
⚠ 注:切换数据库,必须预先注册别名(使⽤已注册的别名)
t_managers import switch_db
class User(Document):
profile中文name = StringField()
meta = {'db_alias': 'user-db'}
with switch_db(User, 'archive-user-db') as User:
User(name='Ross').save() # ===》这时会将数据保存⾄ 'archive-user-db'
2.4.2 切换⽂档
switch_collection()上下⽂管理器允许更改集合,允许快速和⽅便地跨集合访问:
t_managers import switch_collection
class Group(Document):
name = StringField()
Group(name='test').save() # 保存⾄默认数据库
with switch_collection(Group, 'group2000') as Group:
Group(name='hello Group 2000 collection!').save() # 将数据保存⾄ group2000 集合
3.【定义⽂档 Defining Documents】
3.1、定义⽂档模型 Defining a document’s schema
MongoEngine允许为⽂档定义模式,因为这有助于减少编码错误,并允许在可能存在的字段上定义⽅法。
为⽂档定义模式,需创建⼀个继承⾃Document的类,将字段对象作为类属性添加到⽂档类:
from mongoengine import *
import datetime
class Page(Document):
title = StringField(max_length=200, required=True) # ===》创建⼀个String型的字段title,最⼤长度为200字节且为必填项
date_modified = DateTimeField(default=datetime.datetime.utcnow) # ===》创建⼀个时间类型的字段(utcnow是世界时间,now是本地计算机时间)3.2、定义“动态”⽂档模型 Defining a dynamic document’s schema
动态⽂档(Dynamic Document)跟⾮动态⽂档(document)的区别是,动态⽂档可以在模型基础上新增字段,但⾮动态⽂档不允许新增。
⚠ 注意:动态⽂档有⼀点需要注意:字段不能以_开头
from mongoengine import *
class Page(DynamicDocument):
title = StringField(max_length=200, required=True)
# 创建⼀个page实例,并新增tags字段
>>> page = Page(title='Using MongoEngine')
>>> page.tags = ['mongodb', 'mongoengine']
>>> page.save() =====》# 不会报错,可以被保存⾄数据库
>>> Page.objects(tags='mongoengine').count() =====》# 统计 tags=‘mongengine’的⽂档数
>>> 1
3.3 字段 Fields
字段类型包含:(以“》”开头的是常⽤类型,“》”仅⽤于标注)
》BinaryField # ⼆进制字段
》BooleanField # 布尔型字段
》DateTimeField # 后六位精确到毫妙的时间类型字段
ComplexDateTimeField # 后六位精确到微妙的时间类型字段
DecimalField #
》DictField # 字典类型字段
》DynamicField # 动态类型字段,能够处理不同类型的数据
》EmailField # 邮件类型字段
》EmbeddedDocumentField # 嵌⼊式⽂档类型
》
StringField # 字符串类型字段
》URLField # URL类型字段
》SequenceField # 顺序计数器字段,⾃增长
》ListField # 列表类型字段
》ReferenceField # 引⽤类型字段
LazyReferenceField
》IntField # 整数类型字段,存储⼤⼩为32字节
LongField # 长整型字段,存储⼤⼩为64字节
EmbeddedDocumentListField
FileField # 列表类型字段
FloatField # 浮点数类型字段
GenericEmbeddedDocumentField #
GenericReferenceField
GenericLazyReferenceField
GeoPointField
ImageField
MapField
ObjectIdField
SortedListField
UUIDField
PointField
LineStringField
PolygonField
MultiPointField
MultiLineStringField
MultiPolygonField
- 3.3.1
db_field (默认值:⽆) # MongoDB字段名称
required (默认值:False) # 是否必须填写,如果设置为True且未在⽂档实例上设置字段,则在ValidationError验证⽂档时将引发
default (默认值:⽆) # 默认值
unique (默认值:False) # 是否唯⼀,如果为True,则集合中的任何⽂档都不具有此字段的相同值
unique_with (默认值:⽆) # 唯⼀字段列表
primary_key (默认值:False) # 主键
choices (默认值:⽆) # 限制该字段的值(例如列表,元组或集合)
validation (可选的) # 可调⽤以验证字段的值。callable将值作为参数,如果验证失败,则应引发ValidationError
「举例」
def _not_empty(val):
if not val:
raise ValidationError('value can not be empty')
class Person(Document):
name = StringField(validation=_not_empty)
- 3.3.2 类标字段
使⽤ListField字段类型可以向 Document添加项⽬列表。ListField将另⼀个字段对象作为其第⼀个参数,该参数指定可以在列表中存储哪些类型元素:「举例」
class Page (Document ):
tags = ListField (StringField (max_length = 50 )) # ===》 ListField中存放字符串字段
# 应该可以存放任意类型字段
- 3.3.3 内嵌⽂档
MongoDB能够将⽂档嵌⼊到其他⽂档中。要创建嵌⼊式⽂档模型,需要继承EmbeddedDocument:
「举例」
# 创建嵌⼊式⽂档模型
class Comment(EmbeddedDocument):
content = StringField()
# 创建⽂档模型,且将 Comment 嵌⼊Postments列表字段中
class Page(Document):
comments = ListField(EmbeddedDocumentField(Comment))
comment1 = Comment(content='Good work!')
comment2 = Comment(content='Nice article!')
page = Page(comments=[comment1, comment2])
- 3.3.4 字典字段
不知道想要存储什么结构时,可以使⽤字典字段(字典字段不⽀持验证),字典可以存储复杂数据,其他字典,列表,对其他对象的引⽤,因此是最灵活的字段类型:
「举例」
class SurveyResponse(Document):
date = DateTimeField()
user = ReferenceField(User) # ===》引⽤字段,引⽤User类
answers = DictField()
survey_response = SurveyResponse(date=datetime.utcnow(), user=request.user)
response_form = ResponseForm(request.POST) # ===》这段和下⼀段代码,我没看明⽩
survey_response.answers = response_form.cleaned_data() # ===》这段和上⼀段代码,我没看明⽩
survey_response.save()
- 3.3.5 引⽤字段
引⽤⽂档,类似关系型数据库中的外键,如果想引⽤⾃⾝这个类时,使⽤self关键字:
「举例」
class User(Document):
name = StringField()
class Page(Document):
content = StringField()
author = ReferenceField(User) # ===》引⽤User,即Page⽂档与User⽂档建⽴外键关系john = User(name="John Smith")
john.save()
post = Page(content="Test Page")
post.author = john
post.save()
引⽤⾃⾝「举例」
class Employee(Document):
name = StringField()
boss = ReferenceField('self') # ====》引⽤⾃⾝
profile_page = ReferenceField('ProfilePage')
class ProfilePage(Document):
content = StringField()
3.3.5.1. ⽤ListField建⽴⼀对多关系引⽤
「举例」
class User(Document):
name = StringField()
class Page(Document):
content = StringField()
authors = ListField(ReferenceField(User))
bob = User(name="Bob Jones").save()
john = User(name="John Smith").save()
Page(content="Test Page", authors=[bob, john]).save()
Page(content="Another Page", authors=[john]).save()
# 查authored中包含 Bob 的⽂档
Page.objects(authors__in=[bob])
# 查authored中包含 Bob 和 john 的⽂档
Page.objects(authors__all=[bob, john])
# 从被引⽤的⽂档中删除作者 bob
Page.objects(id='...').update_one(pull__authors=bob)
# 将John添加到被引⽤⽂档的作者列表中
Page.objects(id='...').update_one(push__authors=john)
3.3.5.2 删除引⽤⽂档
「举例」
例⼦意味着,如果删除Employee时也会删除对应的关联⽂档ProfilePage
class ProfilePage(Document):
...
employee = ReferenceField('Employee', reverse_delete_rule=mongoengine.CASCADE) reverse_delete_rule有以下可选值:
DO_NOTHING
这是默认设置,不会执⾏任何操作。删除速度很快,但可能导致数据库不⼀致或悬空引⽤。DENY
如果仍存在对要删除的对象的引⽤,则拒绝删除。
NULLIFY
删除任何仍然引⽤被删除对象的对象字段(使⽤MongoDB的“未设置”操作),有效地使关系⽆效。CASCADE
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论