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