Python3 操作 MongoDB 集合分片
阿新 • • 發佈:2018-12-23
因業務需要,使用 Python3 批量生成 MongoDB 集合、並對其做分片操作。
做分片之前需要登陸 Mongo 為要分片的集合所在的庫授權。
# 在 use 庫下對 test 庫進行 sharding 授權
use admin
sh.enableSharding('test')
Python 操作程式碼
import pymongo
import urllib.parse
mongo_client = None
# user passwd 為空或字串
mongo_cfg = {
"host": "127.0.0.1",
"port": 27017,
"user" : "",
"passwd": ""
}
def connect_mongo():
# 連結 mongodb
global mongo_client
host = urllib.parse.quote_plus(mongo_cfg['host'])
port = mongo_cfg['port']
user = urllib.parse.quote_plus(mongo_cfg['user'])
if not user:
mongo_client = pymongo.MongoClient()
return
pw = urllib.parse.quote_plus(mongo_cfg['passwd'])
mongo_url = 'mongo://{}:{}@{}:{}'.format(user, pw, host, port)
mongo_client = pymongo.MongoClient(mongo_url)
def create_col(db_name, col_name, autoindex=1):
# 建立集合
mongo_db = mongo_client[db_name]
mongo_db.create_collection(col_name, autoIndexId=autoindex)
def create_col_index(db_name, col_name, index_colunm):
# 建立獨立索引
mongo_db = mongo_client[db_name]
mongo_db[col_name].create_index( [ (index_colunm, pymongo.ASCENDING) ], background = 1, unique = 1)
def create_col_union_index(db_name, col_name, index_colunm_1, index_colunm_2):
# 建立聯合索引
mongo_db = mongo_client[db_name]
# create_index( [ (index_colunm, 'hashed', pymongo.ASCENDING) ] )
mongo_db[col_name].create_index( [ (index_colunm_1, pymongo.ASCENDING), (index_colunm_2, pymongo.DESCENDING) ], background = 1, unique = 1)
def create_col_indexs(db_name, col_name, index_1, index_2):
# 建立多個單獨索引
mongo_db = mongo_client[db_name]
# 聯合索引
# index_12 = pymongo.IndexModel( [ ('qwer', 'hashed', pymongo.ASCENDING), ('rewq', pymongo.ASCENDING) ], name=[] , background = 1)
index_m_1 = pymongo.IndexModel( [ (index_1, pymongo.ASCENDING) ], background = 1)
index_m_2 = pymongo.IndexModel( [ (index_2, pymongo.ASCENDING) ], background = 1)
mongo_db[col_name].create_indexes( [index_m_1, index_m_2] )
def create_sharding(sharding_col_db, col_name, sharding_colunm, ishashed=False):
'''
為一個集合進行分片、集合所在的資料庫需要有分片許可權、分片的 key 需要有對應的索引
:param sharding_col_db: 分片集合所在的資料庫
:param col_name: 分片集合的名字
:param sharding_colunm: 分片的 key
:param ishashed: 是否為 hash 分片
:return: {'collectionsharded': 'sharding_col_db.col_name', 'ok': 1.0}
'''
admin_db = mongo_client['admin']
abs_path = '{}.{}'.format(sharding_col_db, col_name)
sharding_type = 1 if not ishashed else 'hashed'
return admin_db.command('shardCollection', abs_path, key = {sharding_colunm: sharding_type})