MongoEngine 字段


MongoEngine 文档类具有一个或多个属性。每个属性都是 Field 类的一个对象。 BaseField 是基类或所有字段类型。 BaseField 类的构造函数有以下参数:

BaseField(db_field, required, default, unique, primary_key)

The db_field 表示数据库字段的名称。

required 参数决定是否需要该字段的值,默认为 false。

The default 参数包含该字段的默认值

The unique 参数默认为假。如果你希望此字段对每个文档具有唯一值,请设置为 true。

The 首要的关键 参数默认为假。 True 使该字段成为主键。

有许多从 BaseField 派生的 Field 类。

数值字段


IntField (32位整数), 长场 (64 位整数),FloatField(浮点数)字段构造函数有 min_value 和 max_value 参数。

还有 十进制字段 班级。该字段对象的值是一个可以指定精度的浮点数。 DecimalField 类定义了以下参数:

DecimalField(min_value, max_value, force_string, precision, rounding)
最小值 指定最小可接受值
最大值 指定字段可以具有的最大值
force_string 如果为 True,则该字段的值存储为字符串
精确 将浮动表示限制为位数
rounding 数字根据以下预定义常量四舍五入 decimal.ROUND_CEILING(朝向无穷大) decimal.ROUND_DOWN(趋近于零) decimal.ROUND_FLOOR(朝向 -Infinity) decimal.ROUND_HALF_DOWN(到最近的平局趋于零) decimal.ROUND_HALF_EVEN (到最近的关系到最近的偶数) decimal.ROUND_HALF_UP(到最近的平局从零开始) decimal.ROUND_UP(远离零) decimal.ROUND_05UP(如果舍入为零后的最后一位数字为 0 或 5,则远离零;否则为零)

文本字段


StringField object can store any Unicode value. You can specify min_length and max_length of the string in the constructor. URLField object 是一个 StringField ,能够将输入验证为 URL。 电子邮件字段 将字符串验证为有效的电子邮件表示。

StringField(max-length, min_length)
URLField(url_regex)
EmailField(domain_whiltelist, allow_utf8_user, allow_ip_domain)

domain_whitelist 参数包含你不支持的无效域列表。如果设置为 True,allow_utf8_user 参数允许字符串包含 UTF8 字符作为电子邮件的一部分。 allow_ip_domain 参数默认为 false,但如果为 true,则它可以是有效的 IPV4 或 IPV6 地址。

以下示例使用数字和字符串字段:

from mongoengine import *
connect('studentDB')
class Student(Document):
    studentid = StringField(required=True)
    name = StringField()
    age=IntField(min_value=6, max-value=20)
    percent=DecimalField(precision=2)
    email=EmailField()
s1=Student()
s1.studentid='001'
s1.name='Mohan Lal'
s1.age=20
s1.percent=75
s1.email='mohanlal@gmail.com'
s1.save()

执行上述代码时,学生集合显示如下文档:

Document

列表字段


这种类型的字段包含任何标准字段,因此允许将多个对象用作数据库中的列表对象。此字段可与 ReferenceField 一起使用以实现一对多关系。

上例中的学生文档类修改如下:

from mongoengine import *
connect('studentDB')
class Student(Document):
    studentid = StringField(required=True)
    name = StringField(max_length=50)
    subjects = ListField(StringField())
s1=Student()
s1.studentid='A001'
s1.name='Mohan Lal'
s1.subjects=['phy', 'che', 'maths']
s1.save()

添加的文档以 JSON 格式显示如下:

{
"_id":{"$oid":"5ea6a1f4d8d48409f9640319"},
"studentid":"A001",
"name":"Mohan Lal",
"subjects":["phy","che","maths"]
}

字典域


DictField 类的对象存储一个 Python 字典对象。在相应的数据库字段中,这也将被存储。

代替上面示例中的 ListField,我们将其类型更改为 DictField。

from mongoengine import *
connect('studentDB')
class Student(Document):
    studentid = StringField(required=True)
    name = StringField(max_length=50)
    subjects = DictField()
s1=Student()
s1.studentid='A001'
s1.name='Mohan Lal'
s1.subjects['phy']=60
s1.subjects['che']=70
s1.subjects['maths']=80
s1.save()

数据库中的文档显示如下:

{
"_id":{"$oid":"5ea6cfbe1788374c81ccaacb"},
"studentid":"A001",
"name":"Mohan Lal",
"subjects":{"phy":{"$numberInt":"60"},
                "che":{"$numberInt":"70"},
                "maths":{"$numberInt":"80"}
                }
}

参考字段


MongoDB 文档可以使用这种类型的字段存储对另一个文档的引用。这样,我们可以像在 RDBMS 中一样实现连接。 ReferenceField 构造函数使用其他文档类的名称作为参数。

class doc1(Document):
    field1=StringField()
class doc2(Document):
    field1=StringField()
    field2=ReferenceField(doc1)

在以下示例中,StudentDB 数据库包含两个文档类,学生和教师。学生类的文档包含对教师类对象的引用。

from mongoengine import *
connect('studentDB')
class Teacher (Document):
    tid=StringField(required=True)
    name=StringField()
class Student(Document):
    sid = StringField(required=True)
    name = StringField()
    tid=ReferenceField(Teacher)

t1=Teacher()
t1.tid='T1'
t1.name='Murthy'
t1.save()

s1=Student()
s1.sid='S1'
s1.name='Mohan'
s1.tid=t1
s1.save()

运行上述代码并在 Compass GUI 中验证结果。在 StudentDB 数据库中创建了对应于两个文档类的两个集合。

添加的教师文档如下:

{
"_id":{"$oid":"5ead627463976ea5159f3081"},
"tid":"T1",
"name":"Murthy"
}

学生文档显示内容如下:

{
"_id":{"$oid":"5ead627463976ea5159f3082"},
"sid":"S1",
"name":"Mohan",
"tid":{"$oid":"5ead627463976ea5159f3081"}
}

请注意,学生文档中的 ReferenceField 存储了相应教师文档的 _id。访问时,Student 对象会自动转换为引用,并在访问相应的 Teacher 对象时取消引用。

要添加对正在定义的文档的引用,请使用“self”而不是其他文档类作为 ReferenceField 的参数。可能会注意到,就文档检索而言,使用 ReferenceField 可能会导致性能不佳。

ReferenceField 构造函数还有一个可选参数,即 reverse_delete_rule。它的值决定了如果引用的文档被删除了要做什么。

可能的值如下:

  • DO_NOTHING (0) - 什么都不做(默认)。

  • NULLIFY (1) - 更新对 null 的引用。

  • CASCADE (2) - 删除与参考相关的文档。

  • DENY (3) - 防止删除引用对象。

  • PULL (4) - 从引用的 ListField 中提取引用

你可以使用引用列表实现一对多关系。假设学生文档必须与一个或多个教师文档相关,则 Student 类必须具有 ReferenceField 实例的 ListField。

from mongoengine import *
connect('studentDB')
class Teacher (Document):
tid=StringField(required=True)
name=StringField()
class Student(Document):
    sid = StringField(required=True)
    name = StringField()
    tid=ListField(ReferenceField(Teacher))
t1=Teacher()
t1.tid='T1'
t1.name='Murthy'
t1.save()
t2=Teacher()
t2.tid='T2'
t2.name='Saxena'
t2.save()
s1=Student()
s1.sid='S1'
s1.name='Mohan'
s1.tid=[t1,t2]
s1.save()

在 Compass 中验证上述代码的结果后,你会发现学生文档引用了两个教师文档:

Teacher Collection
{
"_id":{"$oid":"5eaebcb61ae527e0db6d15e4"},
"tid":"T1","name":"Murthy"
}
{
"_id":{"$oid":"5eaebcb61ae527e0db6d15e5"},
"tid":"T2","name":"Saxena"
}
Student collection
{
"_id":{"$oid":"5eaebcb61ae527e0db6d15e6"},
"sid":"S1","name":"Mohan",
"tid":[{"$oid":"5eaebcb61ae527e0db6d15e4"},{"$oid":"5eaebcb61ae527e0db6d15e5"}]
}

DateTimeField


DateTimeField 类的实例允许在 MongoDB 数据库中使用日期格式的数据。 MongoEngine 寻找 Python-DateUtil 库来以适当的日期格式解析数据。如果在当前安装中不可用,则使用内置时间模块的 time.strptime() 函数表示日期。此类型字段的默认值为当前日期时间实例。

动态场


该字段可以处理不同类型的数据。这种类型的字段由内部使用 动态文档 class.

图像域


这种类型的字段对应于文档中可以存储图像文件的字段。此类的构造函数可以接受 size 和 thumbnail_size 参数(均以像素大小表示)。