我有一個Python字典這樣Python字典等效pymongo聲明
{'OR': [{'AND': [{'column': 'XXX', 'operator': '=', 'value': u'M'}, {'column': 'XXX', 'operator': '=', 'value': 'N'}]}, {'column': 'YYY', 'operator': '>=', 'value': '3.0'}]}
現在,我想把它轉換成類似
{'$or': [{'$and': [{'XXX': 'M'}, {'YYY': 'N'}]}, {'YYY': {u'$gte': 3.0}}]}
這顯然是相當於pymongo聲明,我相信。
到目前爲止,我寫的代碼是這樣的:
FILTMAP = {'>=': '$gte', '<=': '$lte', '>': '$gt', '<': '$lt', "!=":"$ne"}
CONJUNCTION_MAP = {"AND":"$and", "OR":"$or"}
def gen_mongo_filters_json(filter, supplied_key="")
first_key = filters.keys()[0]
if first_key == 'OR' or first_key == 'AND':
if supplied_key == "":
return_dict[CONJUNCTION_MAP[first_key]] = []
else:
temp_dict[CONJUNCTION_MAP[first_key]] = []
#return_dict[supplied_key] = temp_dict
for i in range (len(filters[first_key])):
if supplied_key == "":
return_dict[CONJUNCTION_MAP[first_key]].append(gen_mongo_filters_json(filters[first_key][i], first_key))
else:
temp_dict[CONJUNCTION_MAP[first_key]].append(gen_mongo_filters_json(filters[first_key][i], first_key))
return_dict[CONJUNCTION_MAP[supplied_key]].append(temp_dict)
else:
operator = filters['operator']
if operator == "=":
ret_dict = {filters['column']:filters['value']
return ret_dict
else:
operator = FILTMAP[operator]
ret_dict = {filters['column']:{operator:filters['value']}}
return ret_dict
return return_dict
它產生的輸出是:
{u'$or': [{u'$and': [{u'Engine': u'MSN'}, {u'Engine': u'Google'}]}, {u'$and': [{u'Engine': u'MSN'}, {u'Engine': u'Google'}]}, {...}, {u'Imps': {u'$gte': 3.0}}]}
這是附近的解決方案,但沒有一個確切。它適用於像字典
{'AND': [{'column': 'XXX', 'operator': '=', 'value': 'M'}, {'column': 'XXX', 'operator': '=', 'value': 'N'}]}
OR
{'column': 'YYY', 'operator': '>', 'value': '1000'}
你能指點我一個方向嗎?
(這個想法是創建一個通用的。所以,我想產生等同於任何有效的Python解釋成pymongo聲明。最小的是最後一個)