MongoEngine中文文档

2023-11-07

一、简介:

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'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoEngine中文文档 的相关文章

随机推荐

  • PTA题选

    判断题 任何表达式语句都是表达式加分号组成的 True C语言语句都有结束符 指向结构体变量的指针可以作函数参数 实现传址调用 True 结构体成员的类型必须是基本数据类型 False if a 5 是允许的 True a 5 永远为真 假
  • 关于自定义标签报空指针异常:"at org.apache.jasper.compiler.TldCache.getTaglibXml(TldCache.java:97) "...

    tomcat8对相对路径路径的不是很好 可以在web xml文件中设置好tld的路径 然后JSP中直接 web xml文件添加以下配置
  • java面试题个人总结宝典1-java基础篇

    前言 前段时间换工作 用了5天时间整理了一大堆小白面试题 注 本人19年毕业 都是一些个人总结 希望能帮到有需要的人 如果你和我一样也是正准备踏入社会 或者工作还不到2年的 亦或是最近在找 java工程师 之类工作的 那我觉得这个系列非常适
  • Cpp学习——string模拟实现

    目录 一 string的成员变量 二 string的各项功能函数 1 构造函数 2 析构函数 3 扩容函数 4 插入与删除数据的函数 5 运算符重载 6 打印显示函数 7 拷贝构造 8 find函数 一 string的成员变量 在模拟实现s
  • 等保2.0 安全计算环境 ——Windows服务器(三级系统)

    1 身份鉴别 A 应对登录的用户进行身份标识和鉴别 身份标识具有唯一性 身份鉴别信息具有复杂度并要求定期更换 1 核查用户是否需要输入用户名和密码才能登录 2 核查Windows默认用户名是否具有唯一性 3 选择 控制面板 gt 管理工具
  • vscode中设置webpack js alias提示

    vscode 中设置 webpack alias 路径提示 1 根目录下创建 jsconfig json 文件 ts 中 把 文件修改为 tsconfig json 即可 2 添加如下配置 参考着 修改下配置即可 compilerOptio
  • Manjaro/Arch 软件配置安装

    记录一下自己配置 M a n j a r o A
  • 【论文阅读 07】Anomaly region detection and localization in metal surface inspection

    比较老的一篇论文 金属表面检测中的异常区域检测与定位 总结 提出了一个找模板图的方法 使用SIFT做特征提取 姿态估计看差异有哪些 Hough聚类做描述符筛选 仿射变换可视化匹配图之间的关系 提出一个搜索方法 降低图像分辨率 设定对比度和匹
  • kafka3.1集群部署

    kafka依赖zookeeper负责broker的注册 所以需要提前安装好zookeeper 1 安装zookeeper集群 https blog csdn net xiaohanshasha article details 1240083
  • k8s跨主机网络方案之Flannel

    什么是overlay network Overlay 技术是在现有的物理网络之上构建一个虚拟网络 上层应用只与虚拟网络相关 Overlay 在网络技术领域 指的是一种网络架构上叠加的虚拟化技术模式 其大体框架是对基础网络不进行大规模修改的条
  • Python知识点整理,图文结合近三万字(史上最全)

    Python知识点 一 Python精华知识点手册 完整版 下载 Python知识点 二 Python知识点 三 Python对csv的处理 edcoding utf 8 import pandas as pd import csv df
  • [C语言]计算某字符出现次数

    目录 题目 代码 题目 代码 include
  • java IO模型

    目录 IO模型 BIO NIO AIO io多路复用模型 BIO NIO 引出netty IO模型 BIO NIO AIO io多路复用模型 BIO NIO AIO Java中的NIO就是多路复用 linux中的NIO是指普通的非阻塞IO
  • 【精】HDFS无需重启NN进行动态刷新拓扑信息

    本文实现了一个HDFS的Feature 无需滚动重启Namenode即可实现动态加载机架信息 变更集群网络拓扑和机架感知信息 本文会从功能必要性 实现原理 实现源码 测试结果 以及过程中遇到的问题这几个角度来介绍 通过本文可以get如下知识
  • 机器学习(五)—— 决策树回归模型和集合算法

    决策树回归模型和集合算法 1 决策树概述 决策树 Decision Tree 是在已知各种情况发生概率的基础上 通过构成决策树来求取净现值的期望值大于等于零的概率 百度百科 决策树就是我们通常所说的多叉树 决策树回归模型的核心思想 相似的输
  • 《数据挖掘概念与技术》第二章

    数据挖掘概念与技术 第二章 认识数据 目录 认识数据 2 1 数据对象与属性类型 2 1 1 什么是属性 2 1 2 标称属性 2 1 数据对象与属性类型 数据对象组成数据集 一个数据对象是一个实体 数据对象用属性描述 还被称为样本 实例
  • Python基础—文件操作(二)

    Python基础 文件操作 二 CSV格式文件 逗号分隔值 以纯文本形式存储表格数据 由任意数目的记录组成 记录间以换行符分隔 每条记录由字段组成 字段间用逗号或制表符分隔 每条记录都有同样的字段序列 如有列名 位于文件第一行 每条记录数据
  • 精准广告投放

    一 技术层面 1 Paper 雅虎研究院的publication 二 业务层面 1 精准广告定向 一篇总结 该文介绍了User Agent Cookie 各种定向技术和网络广告反作弊 并侧重在业务介绍 该文博主的首页 2 在线展示广告 在线
  • 《The Book of Why》 — Chapter7

    第七章 超越统计调整 征服干预之峰 CHAPTER 7 Beyond Adjustment The Conquest of Mount Intervention 因果之梯的第二层 对未尝试过的行动和策略的效果进行预测 混杂因子是导致我们预测
  • MongoEngine中文文档

    一 简介 MongoEngine是一个基于pymongo开发的ODM库 对应与SQLAlchemy 同时 在MongoEngine基础上封装了Flask MongoEngine 用于支持flask框架 注 本文内容来自官方文档 地址 htt