当前位置: 首页 > 工具软件 > Metaobjects > 使用案例 >

MongoEngine文档—元类Meta定义

施俊驰
2023-12-01

MongoEngine—元类Meta定义

基础设置

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为自定义类中 Documentmeta词典:

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"
 类似资料: