mongoengine一个简单的取模操作

由于内容比较多,且为了读写的速度,所以把一个表拆成10分,根据关键字的id做的取模

代码如下

from mongoengine import Document, StringField, IntField, DateTimeField, ListField, QuerySet, EmbeddedDocument, \
    EmbeddedDocumentField


class KeywordChild(EmbeddedDocument):
    id = IntField(required=True)
    type = StringField(required=True, max_length=100)
    rank = IntField()


class BaseKeywordSearch(object):
    keyword_id = IntField(required=True, max_length=200)
    search_word = StringField(required=True, max_length=200)
    search_count = IntField(required=True, max_length=200)
    create_time = DateTimeField(required=True, max_length=100)
    md5_pass = StringField(required=True, max_length=100)
    result_list = ListField(EmbeddedDocumentField(KeywordChild), required=True)


class KeywordCollection:

    def __init__(self, keyword_id, db_name):
        self.keyword_id = keyword_id
        self.db_name = db_name

    def keyword_collection(self):
        number = self.keyword_id % 10
        db = self.db_name
        for i in BaseKeywordSearch.__subclasses__():
            if f'keyword_{db}_{number}' == str(i.__dict__.get('_meta').get('collection')):
                return i


class SearchKeywordQuerySet(QuerySet):
    def query_set_obj(self, **kwargs):
        where = {k: v for k, v in kwargs.items() if k in ['keyword_id']}  # 筛选查找条件
        if where:
            _query = self.filter(**where).only('keyword_id', 'search_word', 'result_list', 'search_count',
                                               'create_time', ).first()
            if _query:
                return _query
            return None
        return ValueError("query condition's non-existent")


for db in ["aaa", "bbb", "ccc"]:
    for number in range(10):
        type(f'keyword_{db}_{number}', (BaseKeywordSearch, Document),
             {'meta': {'db_alias': f'{db}',
                       'collection': f'keyword_{db}_{number}',
                       'index_background': True,
                       "indexes": ["keyword_id", 'md5_pass'],
                       'queryset_class': SearchKeywordQuerySet}
              })
if __name__ == '__main__':
    # 查找对应的collection
    orm = KeywordCollection(1, 'aaa').keyword_collection()
    print(orm)

其实他的model相当于

# class KeywordChild(EmbeddedDocument):
#     id = IntField(required=True)
#     type = StringField(required=True, max_length=100)
#     rank = IntField()
#
#
# class BaseKeywordSearch(object):
#     keyword_id = IntField(required=True, max_length=200)
#     search_word = StringField(required=True, max_length=200)
#     search_count = IntField(required=True, max_length=200)
#     create_time = DateTimeField(required=True, max_length=100)
#     md5_pass = StringField(required=True, max_length=100)
#     result_list = ListField(EmbeddedDocumentField(KeywordChild), required=True)
#     meta = {
#         'db_alias': 'aaa',
#         'index_background': True,
#         "indexes": ["keyword_id", 'md5_pass'],
#         'queryset_class': SearchKeywordQuerySet
#     }

 

posted @ 2019-08-29 11:38  洛丶丶丶  阅读(479)  评论(0编辑  收藏  举报