MongoEngine 简介安装、连接、数据类型及其参数详解

文章目录

  • 前言
  • 一、MongoEngine 简介
  • 二、MongoEngine的安装与连接
    • 1. 安装MongoEngine
    • 2. 连接到MongoDB
    • 3. 定义数据模型
  • 三、MongoEngine模型介绍
    • 1. 常见数据类型
    • 2. 数据类型参数
  • 总结

前言

为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

MongoEngine官方文档:http://docs.mongoengine.org/tutorial.html

一、MongoEngine 简介

Mongoengine是一个用于在 Python 应用程序中操作 MongoDB 数据库的 Object-Document Mapping (ODM) 库。它允许开发人员使用 Python 类来定义数据模型,然后通过这些模型执行数据库操作,而不需要编写原始的MongoDB查询语句。以下是Mongoengine的一些关键特点和用途:

  • Object-Document Mapping (ODM):Mongoengine 提供了一种方便的方式来映射 Python 类和 MongoDB 文档之间的关系。你可以定义 Python 类来表示 MongoDB 中的文档,每个类属性对应文档的字段,从而简化了文档的创建、查询和更新操作。
  • 模型定义:Mongoengine 允许你使用 Python 类来定义 MongoDB 文档的结构。这些模型类可以包含字段的定义、验证规则以及与其他模型之间的关系。这种方式使得数据模型的设计更加直观和可维护。
  • 丰富的查询功能:Mongoengine 提供了丰富的查询功能,使你能够执行高级的查询操作,包括过滤、排序、聚合等。你可以使用链式方法构建查询,并得到符合条件的文档集合。
  • 自动索引管理:Mongoengine 能够自动管理数据库中的索引,以提高查询性能。你可以在模型中定义索引规则,Mongoengine 会在数据库中创建和维护这些索引。
  • 数据验证:Mongoengine 提供了数据验证功能,确保文档符合定义的模型规则。这有助于维持数据的一致性和完整性。
  • 支持复杂数据类型:Mongoengine 支持多种复杂数据类型,如嵌套文档、列表和字典,使你能够更灵活地表示数据结构。
  • 轻量级:Mongoengine 是一个相对轻量级的库,易于集成到Python应用程序中。它不需要过多的配置或依赖项。

Mongoengine 在与 MongoDB 一起构建 Python 应用程序时非常有用,特别是对于那些需要处理半结构化或非关系型数据的应用程序。通过 Mongoengine,开发人员可以更轻松地管理和操作 MongoDB 中的数据,而不需要直接操作原始的 MongoDB 查询语句。

在这里插入图片描述

二、MongoEngine的安装与连接

1. 安装MongoEngine

使用pip安装MongoEngine:打开终端(命令行)并运行以下命令来安装MongoEngine:

 pip install mongoengine

这会使用pip工具从Python Package Index(PyPI)安装MongoEngine库。

2. 连接到MongoDB

一旦MongoEngine安装完成,你可以在Python中使用它来连接到MongoDB。以下是连接到MongoDB的步骤:

from mongoengine import connect# 连接到MongoDB
connect(db='your_database_name',host='your_mongodb_uri',  #默认端口为27017时可以不写username='your_username',  # 如果需要认证password='your_password'   # 如果需要认证
)

上述代码中的参数含义如下:

db: 要连接的数据库名称。

host: MongoDB服务器的URI。通常,这是MongoDB服务器的IP地址和端口号(例如:‘mongodb://localhost:27017’),但也可以包括其他连接参数,如认证信息。

username(可选): 如果MongoDB服务器需要用户名和密码进行身份验证,则提供MongoDB用户名。

password(可选): 如果MongoDB服务器需要用户名和密码进行身份验证,则提供MongoDB密码。

3. 定义数据模型

使用MongoEngine定义一个简单的数据模型需要遵循以下步骤:

1. 导入必要的类和字段类型:

from mongoengine import Document, StringField, IntField

2. 创建一个继承自 Document 的类作为你的数据模型:

class Person(Document):pass

3. 在数据模型类中定义字段,可以使用MongoEngine提供的字段类型:

class Person(Document):name = StringField(required=True, max_length=100)age = IntField()

在上述代码中,我们定义了两个字段:name 和 age。StringField表示一个字符串字段,IntField表示一个整数字段。你可以根据需要选择其他字段类型,如BooleanField(布尔字段)、ListField(列表字段)等。

在字段定义中,你可以传递多个参数来指定字段的行为,如上述示例中的required=True表示该字段是必需的,max_length=100表示该字段的最大长度为100个字符。

4. 操作数据

这样,你就完成了一个简单的数据模型的定义。现在可以使用该模型来执行数据库操作,如插入数据、查询数据等。

person = Person(name='John Doe', age=25)
person.save()  # 插入数据# 查询数据
people = Person.objects(name='John Doe')
for p in people:print(p.name, p.age)

在上述代码中,我们创建了一个Person对象并保存到数据库中。然后,使用 Person.objects 方法通过查询条件来检索 Person 对象,并遍历结果打印出对象的 name 和 age 字段。

三、MongoEngine模型介绍

在这里插入图片描述

1. 常见数据类型

  • StringField: 用于存储字符串类型的数据。
from mongoengine import StringFieldclass Person(Document):name = StringField(max_length=100)
  • IntField: 用于存储整数类型的数据。
from mongoengine import IntFieldclass Product(Document):price = IntField()
  • FloatField: 用于存储浮点数类型的数据。
from mongoengine import FloatFieldclass Product(Document):weight = FloatField()
  • BooleanField: 用于存储布尔值类型的数据。
from mongoengine import BooleanFieldclass Task(Document):completed = BooleanField(default=False)
  • DateTimeField: 用于存储日期和时间类型的数据。
from mongoengine import DateTimeFieldclass Event(Document):event_date = DateTimeField()
  • ListField: 用于存储列表类型的数据,可以包含不同类型的元素。
from mongoengine import ListFieldclass ShoppingCart(Document):items = ListField(StringField())
  • .EmbeddedDocumentField: 用于嵌入其他文档模型作为字段的一部分。
from mongoengine import EmbeddedDocument, EmbeddedDocumentFieldclass Address(EmbeddedDocument):street = StringField()city = StringField()state = StringField()class Person(Document):name = StringField()address = EmbeddedDocumentField(Address)
  • ReferenceField: 用于存储文档之间的关联关系,通常用于实现文档之间的引用。
from mongoengine import ReferenceFieldclass Comment(Document):text = StringField()class Post(Document):title = StringField()comments = ListField(ReferenceField(Comment))

2. 数据类型参数

1. 通用参数

  • required: 指示字段是否为必需的,默认为False。如果设置为True,则在保存文档时必须提供该字段的值。
name = StringField(required=True)
  • default: 指定字段的默认值。如果在保存文档时没有为该字段赋值,则将使用默认值。
age = IntField(default=0)
  • unique: 指示字段的值是否必须在集合中是唯一的,默认为False。如果设置为True,则确保集合中的字段值都是唯一的。
email = StringField(unique=True)
  • primary_key: 是否为文档的主键,默认为False
book_id = IntField(primary_key=True)
  • choices: 指定字段的可接受值的列表或元组。只有在这些值中选择的值才会被接受。
gender = StringField(choices=['male', 'female', 'other'])
  • verbose_name: 指定字段的可读性良好的名称。这个参数主要用于生成文档的人类可读的描述。
name = StringField(verbose_name='Full Name')
  • help_text: 提供有关字段的帮助文本,用于描述字段或提供使用说明。
age = IntField(help_text='Please enter your age in years.')

2. StringField:

  • max_length: 指定字符串的最大长度。
  • min_length: 指定字符串的最小长度。
  • regex: 指定一个正则表达式,限制允许的字符串模式。
  • choices: 指定一个列表或元组,限制可接受的字符串值。
name = StringField(max_length=100, min_length=2, regex=r'^[A-Za-z ]*$', choices=['Mr.', 'Mrs.', 'Ms.'])

3. IntField:

  • min_value: 指定整数字段的最小值。
  • max_value: 指定整数字段的最大值。
age = IntField(min_value=0, max_value=150)

4. FloatField:

  • min_value: 指定浮点数字段的最小值。
  • max_value: 指定浮点数字段的最大值。
price = FloatField(min_value=0.0, max_value=1000.0)

5. BooleanField:

  • 无特定参数,通常用于表示布尔值(True或False)。
completed = BooleanField()

6. DateTimeField:

  • default: 指定默认日期时间值。
  • auto_now: 如果设置为True,每次保存文档时都会更新字段为当前日期时间。
created_at = DateTimeField(default=datetime.datetime.now, auto_now=True)

7. ListField:

  • field: 指定列表中元素的数据类型。
items = ListField(StringField(max_length=50))

8. EmbeddedDocumentField:

  • document_type: 指定嵌入式文档的类型。
class Address(EmbeddedDocument):street = StringField()city = StringField()address = EmbeddedDocumentField(Address)

9. ReferenceField:

  • document_type: 指定引用的文档类型。
  • reverse_delete_rule: 指定在引用文档删除时如何处理引用。
class Comment(Document):text = StringField()class Post(Document):title = StringField()comments = ListField(ReferenceField(Comment, reverse_delete_rule=CASCADE))

总结

欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/150740.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux服务器报错“No space left on device”如何解决

一、错误的含义,说明在服务器设备上的存储空间已经满了,不能再上传或者新建文件夹或者文件等。 二、确认查看服务器系统的磁盘使用情况是否是真的已经没有剩余空间,复制下面命令在服务器上运行,然后发现如果如下图所示那么表明sda…

【拿完年终奖后】想要转行网络安全,一定不要错过这个时间段。

网络安全,作为当下互联网行业中较为热门的岗位,薪资可观、人才需求量大,作为转行必考虑。 在这里奉劝所有零基础想转行(入门) 网络安全的朋友们 在转行之前,一定要对网络安全行业做一个大概了解&#xf…

解决方案:AI赋能工业生产3.0,从工业“制造”到“智造”

视频监控技术是一种既成熟又广泛应用于工业制造领域的先进技术。它可以通过安装各种摄像头和传感器来监测整个生产流程,包括原材料的采购、加工、装配和物流等环节,从而实现对生产过程的实时监控和管理,以及对异常事件的及时预警和响应。 在…

用一个已有数据源做ADSO模型(自用方便忘了回顾,不是教程,各位可参考,但不做解答)

由于是公司流程不便解读,本篇仅作为个人存档回顾以及参考使用 前置: 装了BW的eclipse SAP Logon 一个已经做好但是放在S4上的BW数据源 ZBW_T856 流程: A、由于数据源在S4上还不在BW上,我们需要先将它引进BW A1:首先现在你放置…

Java虚拟机内存模型

JVM虚拟机将内存数据分为: 程序计数器、虚拟机栈、本地方法栈、Java堆、方法区等部分。 程序计数器用于存放下一条运行的指令; 虚拟机栈和本地方法栈用于存放函数调用堆栈信息; Java堆用于存放Java程序运行时所需的对象等数据&#xff1b…

Lumos-az/MiniSQL阅读笔记

文章目录 处理SQL创建创建表RecordManager部分CatalogManager部分 创建索引IndexManager::createIndex部分API::createNewIndex部分CatalogManager::createIndex部分 插入删除删除表删除记录? 查询B树gif演示B树增删:插入:删除: 项目源码&am…

Linux和Hadoop的学习

目录 1. Linux的常用快捷键2. Hadoop集群部署问题汇总 1. Linux的常用快捷键 复制:CtrlshiftC 粘贴:CtrlshiftV TAB:补全命令 编写输入:i 退出编写:esc 保存并退出:shift: 2. Hadoop集群部署问…

人工智能驱动的古彝文识别:保护和传承古彝文文化

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

微信小程序通过createSelectorQuery获取元素 高度,宽度与界面距离

小程序官方有提供给我们一个 const query wx.createSelectorQuery() 函数 我们可以先编写这样一段代码 wxml <view><button bindtap"getDom">点击查看</button><view class "textIn" style "height: 100px;width: 30px;&quo…

Kaggle - LLM Science Exam(二):Open Book QAdebertav3-large详解

文章目录 前言&#xff1a;优秀notebook介绍三、Open Book Q&A3.1 概述3.2 安装依赖&#xff0c;导入数据3.3 数据预处理3.3.1 处理prompt3.3.2 处理wiki数据 3.4 使用faiss搜索获取匹配的Prompt-Sentence Pairs3.5 查看context结果并保存3.6 推理3.6.1 加载测试集3.6.2 定…

ARM汇编学习录 1 -基础概念

指令集概述 现阶段有四个不同的指令集 名称概述ARM3232位指令集Thumb16位指令集,ARM32子集,提供高密度低功耗Thumb232位指令集,ARMv6T2 引入.是thumb超集ARM6464位指令集 note&#xff1a; ARM某一个时刻只能运行单独ARM指令集或者Thumb指令,通过CPSR的T标志位决定. 如何当前…

人机言语交互模型的评估要素

智能客服中的言语交互模型评估要素&#xff0c;主要包括以下几个方面&#xff1a; 有效性&#xff1a;指模型能否准确识别和理解用户的言语意图&#xff0c;以及生成正确和合适的回答。可以通过比较模型生成的回答与人工回答的准确率来评估。流畅性&#xff1a;指模型在回答问…

c语言:通讯录管理系统(动态分配内存版)

前言&#xff1a;在大多数高校内&#xff0c;都是通过设计一个通讯录管理系统来作为c语言课程设计&#xff0c;通过一个具体的系统设计将我们学习过的结构体和函数等知识糅合起来&#xff0c;可以很好的锻炼学生的编程思维&#xff0c;本文旨在为通讯录管理系统的设计提供思路和…

国科大体系结构习题 | 第三章 二进制与逻辑电路

第三章 Q1: A1:(1) 原码&#xff1a; [ − ( 2 63 − 1 &#xff0c; 2 63 − 1 ] [-(2^{63}-1&#xff0c;2^{63}-1] [−(263−1&#xff0c;263−1] 补码&#xff1a; [ − ( 2 63 &#xff0c; 2 63 − 1 ] [-(2^{63}&#xff0c;2^{63}-1] [−(263&#xff0c;263−1] …

门窗定制销售小程序商城的作用是什么

门窗属于建材物料行业里重要的体系&#xff0c;生活中需求度非常高&#xff0c;虽然门窗产品使用周期较长&#xff0c;客户旧换新复购率较低&#xff0c;但由于产品属于家家户户都需要&#xff0c;因此市场规模依然是稳增不减。 互联网环境下&#xff0c;客户更习惯于线上获得…

cpp primer plus笔记01-注意事项

cpp尽量以int main()写函数头而不是以main()或者int main(void)或者void main()写。 cpp尽量上图用第4行的注释而不是用第5行注释。 尽量不要引用命名空间比如:using namespace std; 函数体内引用的命名空间会随着函数生命周期结束而失效&#xff0c;放置在全局引用的命名空…

Leetcode901-股票价格跨度

一、前言 本题基于leetcode901股票价格趋势这道题&#xff0c;说一下通过java解决的一些方法。并且解释一下笔者写这道题之前的想法和一些自己遇到的错误。需要注意的是&#xff0c;该题最多调用 next 方法 10^4 次,一般出现该提示说明需要注意时间复杂度。 二、解决思路 ①…

云原生微服务 第六章 Spring Cloud中使用OpenFeign

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 文章目录 系列文章目录前言1、OpenFeign的实现…

SAP从入门到放弃系列之QM目录类别、代码组、选择集维护

目录 一、概念相关内容1.1 目录类别1.2 代码组和代码1.3 选择集和选择集代码 二、系统操作相关内容 一、概念相关内容 1.1 目录类别 目录类别是对定性数据的一种归纳&#xff0c;描述了业务的主题。根据PA的教材中表述&#xff0c;目录类型 0 - 9 和 A - O 由 SAP 定义&#…

如何自学(黑客)网络安全技术————(详细分析学习思路)方法

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学&#xff1f;如何学&#xff1f; 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c…