- Mongo引擎教程
- MongoEngine - 主页
- MongoEngine——MongoDB
- MongoEngine - MongoDB 指南针
- MongoEngine - 对象文档映射器
- MongoEngine - 安装
- MongoEngine - 连接到 MongoDB 数据库
- MongoEngine - 文档类
- MongoEngine - 动态模式
- MongoEngine - 字段
- MongoEngine - 添加/删除文档
- MongoEngine - 查询数据库
- MongoEngine - 过滤器
- MongoEngine - 查询运算符
- MongoEngine - 查询集方法
- MongoEngine - 排序
- MongoEngine - 自定义查询集
- MongoEngine - 索引
- MongoEngine - 聚合
- MongoEngine - 高级查询
- MongoEngine - 文档继承
- MongoEngine - 原子更新
- MongoEngine-Javascript
- MongoEngine-GridFS
- MongoEngine - 信号
- MongoEngine - 文本搜索
- MongoEngine - 扩展
- MongoEngine 有用资源
- MongoEngine - 快速指南
- MongoEngine - 有用的资源
- MongoEngine - 讨论
MongoEngine - 字段
MongoEngine 文档类具有一个或多个属性。每个属性都是 Field 类的一个对象。BaseField 是基类或所有字段类型。BaseField 类构造函数具有以下参数 -
BaseField(db_field,必填,默认,唯一,主键)
db_field表示数据库字段的名称。
required 参数决定该字段的值是否为必填项,默认为 false。
默认参数包含该字段的默认值
unique参数默认为 false 。如果您希望此字段对于每个文档都具有唯一值,则设置为 true。
Primary_key参数默认为 false 。True 使该字段成为主键。
有许多从 BaseField 派生的 Field 类。
数字字段
IntField(32 位整数)、LongField(64 位整数)、FloatField(浮点数)字段构造函数具有 min_value 和 max_value 参数。
还有DecimalField类。该字段对象的值是一个浮点数,其精度可以指定。以下参数是为 DecimalField 类定义的 -
DecimalField(最小值、最大值、force_string、精度、舍入)
最小值 | 指定最小可接受值 |
最大值 | 指定字段可以具有的最大值 |
强制字符串 | 如果为 True,则该字段的值存储为字符串 |
精确 | 将浮动表示形式限制为位数 |
四舍五入 | 根据以下预定义常量对数字进行舍入:decimal.ROUND_CEILING(向无穷大)decimal.ROUND_DOWN(向零)decimal.ROUND_FLOOR(向-无穷大)decimal.ROUND_HALF_DOWN(向最接近的关系趋向零)decimal.ROUND_HALF_EVEN(向最接近的关系)到最接近的偶数)decimal.ROUND_HALF_UP(到最接近的且远离零的关系)decimal.ROUND_UP(远离零)decimal.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 字符作为电子邮件的一部分。allowed_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()
执行上述代码时,学生集合显示如下文档 -
列表字段
这种类型的字段包装任何标准字段,从而允许将多个对象用作数据库中的列表对象。该字段可以与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 中那样实现 join。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"} }
请注意,Student 文档中的 ReferenceField 存储了相应 Teacher 文档的 _id。当访问时,Student 对象会自动转换为引用,并在访问相应的 Teacher 对象时取消引用。
要添加对正在定义的文档的引用,请使用“self”而不是其他文档类作为 ReferenceField 的参数。可能会注意到,就文档检索而言,使用 ReferenceField 可能会导致性能不佳。
ReferenceField 构造函数还有一个可选参数:reverse_delete_rule。它的值决定了当引用的文档被删除时要做什么。
可能的值如下 -
DO_NOTHING (0) - 不执行任何操作(默认)。
NULLIFY (1) - 将引用更新为 null。
CASCADE (2) - 删除与参考相关的文档。
DENY (3) - 阻止删除引用对象。
PULL (4) - 从引用列表字段中拉出引用
您可以使用引用列表实现一对多关系。假设学生文档必须与一个或多个教师文档相关,则 Student 类必须具有 ReferenceField 实例的 ListField。
从 mongoengine 导入 * 连接('studentDB') 班主任(文件): tid=StringField(必需=True) 名称=字符串字段() 班级学生(文件): sid = StringField(必需=True) 名称 = 字符串字段() tid=ListField(ReferenceField(老师)) t1=老师() t1.tid='T1' t1.name='穆蒂' t1.保存() t2=老师() t2.tid='T2' t2.name='萨克塞纳' t2.保存() s1=学生() s1.sid='S1' s1.name='莫罕' s1.tid=[t1,t2] s1.save()
在 Compass 中验证上述代码的结果时,您会发现学生文档引用了两个教师文档 -
教师收藏 { "_id":{"$oid":"5eaebcb61ae527e0db6d15e4"}, "tid":"T1","name":"Murthy" } { "_id":{"$oid":"5eaebcb61ae527e0db6d15e5"}, "tid":"T2","name":"萨克塞纳" } 学生收藏 { "_id":{"$oid":"5eaebcb61ae527e0db6d15e6"}, "sid":"S1","name":"莫罕", "tid":[{"$oid":"5eaebcb61ae527e0db6d15e4"},{"$oid":"5eaebcb61ae527e0db6d15e5"}] }
日期时间字段
DateTimeField 类的实例允许 MongoDB 数据库中的日期格式的数据。MongoEngine 寻找 Python-DateUtil 库来解析适当日期格式的数据。如果当前安装中不可用,则使用内置时间模块的 time.strptime() 函数表示日期。该类型字段的默认值是当前日期时间实例。
动态场
该字段可以处理不同类型的数据。这种类型的字段由DynamicDocument类内部使用。
图像场
这种类型的字段对应于文档中可以存储图像文件的字段。此类的构造函数可以接受 size 和thumbnail_size 参数(均以像素大小表示)。