私はこのようなpython辞書を持っています
{'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ステートメントに生成したいと思います。最小値は最後のものです)