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


    前言

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

    发现宝藏

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。

    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
    
    • 1

    这会使用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'   # 如果需要认证
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

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

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

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

    3. 定义数据模型

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

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

    from mongoengine import Document, StringField, IntField
    
    • 1

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

    class Person(Document):
        pass
    
    • 1
    • 2

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

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

    在上述代码中,我们定义了两个字段: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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    三、MongoEngine模型介绍

    在这里插入图片描述

    1. 常见数据类型

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

    2. 数据类型参数

    1. 通用参数

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

    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.'])
    
    • 1

    3. IntField:

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

    4. FloatField:

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

    5. BooleanField:

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

    6. DateTimeField:

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

    7. ListField:

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

    8. EmbeddedDocumentField:

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

    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    总结

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

  • 相关阅读:
    RocketMQ源码(16)—消费者负载均衡服务RebalanceService入口源码
    爱上开源之DockerUI-如何实现Web端的Xshell终端模拟器
    SoC第一个工程hello_world
    Android --- SharedPreferences
    Sora:AI视频模型的无限可能与挑战
    数据结构从入门到精通——栈
    世上最全NVDIA GPU参数列表: 3090,4090, A40, A30,V100, A100, A800性能参数
    遗传算法【Python】
    mysql中使用聚合函数结果集为空,仍显示size为1,所有元素为Null问题的解决
    过滤器和拦截器的辨析
  • 原文地址:https://blog.csdn.net/HHX_01/article/details/133645596