MongoEngine中文文档

MongoEngine是基于pymongo的ODM库,提供了与SQLAlchemy类似的接口。本教程涵盖了从安装、连接MongoDB(包括本地、远程及带验证的连接)到定义文档模型、字段类型(如ListField、Embedded Document等)、索引、查询、聚合等功能的详细步骤。还介绍了如何使用文本搜索和信号机制。文档中还包含了多个示例代码以帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介:

MongoEngine是一个基于pymongo开发的ODM库,对应与SQLAlchemy。同时,在MongoEngine基础上封装了Flask-MongoEngine,用于支持flask框架。

⚠️注:本文内容来自官方文档(地址:http://docs.mongoengine.org/index.html )

二、入门教程

1、【安装MongoEngine】

pip3 install mongoengine

⚠️注:安装python3.x时自动安装pip3工具

2、【链接至MongoDB】

2.1、连接数据库

- 2.1.1、方法一 连接本地数据库
from mongoengine import connect
connect('dbname', alias='别名')

⚠️注:默认链接至本地数据库127.0.0.1:27017,每次创建连接可以给这几个连接取一个别名,用于区别其它的连接,默认情况下别名为default

- 2.1.2、方法二 连接远程数据库
from mongoengine import connect
connect('dbname', host='远程服务器IP地址', post=开放的端口号)
- 2.1.3、方法三 连接带有验证的远程数据库
from mongoengine import connect
connect('dbname', username='用户名', password='密码', authentication_source='admin',  host='远程服务器IP地址', post=开放的端口号)
- 2.1.4、方法四 URI方式连接数据库
from mongoengine import connect
connect('dbname', host='mongodb://用户名:密码@服务器IP地址database_name')

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.3.1、在不同数据库中定义的文档

通过在元数据中提供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.3.2、断开现有连接

该功能 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()

switch_db上允许更改数据库别名给定类,允许快速和方便地跨数据库访问:
⚠️注:切换数据库,必须预先注册别名(使用已注册的别名)

from mongoengine.context_managers import switch_db

class User(Document):
    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()

switch_collection()上下文管理器允许更改集合,允许快速和方便地跨集合访问:

from mongoengine.context_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)

**kwargs (可选的)

- 3.3.2 类标字段 ListField

使用ListField字段类型可以向 Document添加项目列表。ListField将另一个字段对象作为其第一个参数,该参数指定可以在列表中存储哪些类型元素:
「举例」

class  Page (Document ):
    tags  =  ListField (StringField (max_length = 50 ))   # ===》 ListField中存放字符串字段
# 应该可以存放任意类型字段
- 3.3.3 内嵌文档 Embedded Document

MongoDB能够将文档嵌入到其他文档中。要创建嵌入式文档模型,需要继承EmbeddedDocument:
「举例」

# 创建嵌入式文档模型
class Comment(EmbeddedDocument):
    content = StringField()

# 创建文档模型,且将 Comment 嵌入Post.comments列表字段中
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 字典字段 Dictionary Fields

不知道想要存储什么结构时,可以使用字典字段(字典字段不支持验证),字典可以存储复杂数据,其他字典,列表,对其他对象的引用,因此是最灵活的字段类型:
「举例」

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 引用字段 Reference fields

引用文档,类似关系型数据库中的外键,如果想引用自身这个类时,使用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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值