MongoEngine – 字段

MongoEngine – 字段

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

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

db_field 代表数据库字段的名称。

required参数决定这个字段的值是否是必需的,默认为false。

默认 参数包含该字段的默认值。

unique 参数默认为false。如果你想让这个字段在每个文档中都有唯一的值,请设置为true。

primary_key 参数默认为false。为真则此字段为主键。

有许多从BaseField派生的字段类。

数值字段

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

还有一个 DecimalField 类。这个字段的对象的值是一个浮点数,其精度可以被指定。以下是为DecimalField类定义的参数-

DecimalField(min_value, max_value, force_string, precision, rounding)
min_value 指定可接受的最小值
max_value 指定该字段可以有的最大值
force_string 如果是True,这个字段的值将以字符串的形式存储。
precision 限制浮动表示法的位数
rounding 数字按照以下预定义的常数进行四舍五入 decimal.ROUND_CEILING (朝向无穷大) decimal.ROUND_DOWN (朝向零) decimal.ROUND_FLOOR (朝向-无穷大) decimal.ROUND_HALF_DOWN (到最近的,并联到零) decimal.十进制.ROUND_HALF_EVEN (向最近的偶数整数并列前进) 十进制.ROUND_HALF_UP (向最近的并列前进,远离零) 十进制.ROUND_UP (远离零) 十进制.ROUND_05UP (如果向零进位后最后一位数字是0或5,则远离零,否则向零前进)

文本字段

StringField对象可以存储任何Unicode值。你可以在构造函数中指定字符串的min_length和max_length。 URLField 对象是一个StringField,具有验证输入为URL的能力。 EmailField 将字符串验证为有效的电子邮件表示。

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参数默认为假,但如果为真,它可以是一个有效的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()

当上述代码被执行时,学生集合显示了一个文件,如下所示

MongoEngine - 字段

ListField

这种类型的字段包装了任何标准字段,从而允许在数据库中把多个对象作为一个列表对象使用。这种字段可以与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

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"}
            }
}

ReferenceField

一个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。当访问时,学生对象会自动变成一个引用,并在访问相应的教师对象时被取消引用。

要向正在定义的文档添加引用,请使用 “self “而不是其他文档类作为ReferenceField的参数。可以注意的是,使用ReferenceField可能会导致检索文档的性能下降。

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

可能的值如下

  • DO_NOTHING (0) – 不做任何事情(默认)。

  • NULLIFY (1) – 将引用更新为空。

  • CASCADE (2) – 删除与该引用相关的文件。

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

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

你可以使用引用列表来实现一对多的关系。假设一个学生文档必须与一个或多个教师文档相关,学生类必须有一个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()函数表示日期。这种类型的字段的默认值是当前的日期时间实例。

DynamicField

不同的和变化的数据类型可以由这个字段处理。这种类型的字段由 DynamicDocument 类内部使用。

ImageField

这种类型的字段对应于文档中可以存储图像文件的字段。该类的构造函数可以接受大小和缩略图大小参数(都是像素大小)。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程