class User(db.Documents):
name = db.StringField()
meta = {
# 自定义集合名
'verbose_name': '员工',
# 自定义在数据库存储的集合名
'collection': 'staff',
# 最大文档数
'max_documents': 1000,
# 最大存储 2M
'max_size': 2000000
}
class BlogPost(Document):
title = StringField()
published_date = DateTimeField()
meta = {
'ordering': ['-published_date']
}
class Page(Document):
category = IntField()
title = StringField()
rating = StringField()
created = DateTimeField()
meta = {
# 索引,加快查询速度
'indexes': [
'title',
'$title', # 文本索引
'#title', # hashed index
('title', '-rating'),
('category', '_cls'),
{
'fields': ['created'],
'expireAfterSeconds': 3600
}
]
}
class Page(Document):
title = StringField()
rating = StringField()
meta = {
'index_opts': {},
'index_background': True,
'index_cls': False,
'auto_create_index': True,
'index_drop_dups': True,
}
解释
index_opts
(可选的)
设置任何默认索引选项 - 请参阅完整选项列表
index_background
(可选的)
如果索引应在后台索引,请设置默认值
index_cls
(可选的)
一种关闭_cls的特定索引的方法。
auto_create_index
(可选的)
当这是True(默认)时,MongoEngine将确保每次运行命令时MongoDB中都存在正确的索引。可以在单独管理索引的系统中禁用此功能。禁用此功能可以提高性能。
index_drop_dups
(可选的)
如果索引应该删除重复项,请设置默认值因为不再支持MongoDB 3.0 drop_dups。提出警告但没有效果
class Log(Document):
location = PointField(auto_index=False)
datetime = DateTimeField()
meta = {
'indexes': [[("location", "2dsphere"), ("datetime", 1)]]
}
继承文档字段
class Page(Document):
title = StringField(max_length=200, required=True)
meta = {'allow_inheritance': True} #这里要设置为True,默认是False
# Also stored in the collection named 'page'
class DatedPage(Page):
date = DateTimeField()
如果您想为一组Document类添加一些额外的功能,但您不需要或不需要继承的开销,则可以使用该 abstract
属性meta
。这不会打开文档继承,但可以让您保持代码干净:
class BaseDocument(Document):
meta = {
'abstract': True,
}
def check_permissions(self):
...
class User(BaseDocument):
...
如果要添加自定义方法以与文档交互或过滤文档,QuerySet
可以继续扩展类。要使用自定义QuerySet
上的文档类,设置queryset_class
为自定义类中 Document
的meta
词典:
class AwesomerQuerySet(QuerySet):
def get_awesome(self):
return self.filter(awesome=True)
class Page(Document):
meta = {'queryset_class': AwesomerQuerySet}
# To call:
Page.objects.get_awesome()
class News(Document):
title = StringField()
content = StringField()
is_active = BooleanField()
meta = {'indexes': [
{'fields': ['$title', "$content"],
'default_language': 'english',
'weights': {'title': 10, 'content': 2}
}
]}
News(title="Using mongodb text search",
content="Testing text search").save()
News(title="MongoEngine 0.9 released",
content="Various improvements").save()
使用
document = News.objects.search_text('testing').first()
document.title # may be: "Using mongodb text search"
document = News.objects.search_text('released').first()
document.title # may be: "MongoEngine 0.9 released"