gpt4 book ai didi

等效于 pymongo 语句的 Python 字典

转载 作者:太空宇宙 更新时间:2023-11-03 11:08:37 27 4
gpt4 key购买 nike

我有一个像这样的 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 语句中。最小的是最后一个)

最佳答案

你的示例代码没有运行,但是给出了一个字典

{'OR': [{'AND': [{'column': 'XXX', 'operator': '=', 'value': 'M'}, {'column': 'YYY', 'operator': '=', 'value': 'N'}]}, {'column': 'YYY', 'operator': '>=', 'value': '3.0'}]}

应该转换为

{'$or': [{'$and': [{'XXX': 'M'}, {'YYY': 'N'}]}, {'YYY': {'$gte': 3.0}}]}

使用这样的东西:

FILTMAP = {'>=': '$gte', '<=': '$lte', '>': '$gt', '<': '$lt', "!=":"$ne"}
CONJUNCTION_MAP = {"AND":"$and", "OR":"$or"}

def convert_column(dic):
if not dic['operator'] in FILTMAP:
return {dic['column']: dic['value']}
else:
value = float(dic['value']) if dic['operator'] == "!=" else dic['value']
return {dic['column']: {FILTMAP[dic['operator']]: value}}

def convert(dic):
for k,v in dic.items():
if isinstance(v, list):
if k in CONJUNCTION_MAP:
k = CONJUNCTION_MAP[k]
return {k: [convert(i) for i in v]}
else:
return convert_column(dic)

我不知道将'3.0' 转换为3.0 是否重要。线路

value = float(dic['value']) if dic['operator'] == "!=" else dic['value']

非常骇人听闻,您想用一些适当的逻辑替换它来处理这些情况。

关于等效于 pymongo 语句的 Python 字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12725768/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com