Necesito tomar un JSON (condiciones para filtrar datos), datos de ejemplo:
query = { "and": [ { "field": "model", "operator": ">", "value": "2005" }, { "or": [ { "field": "brand", "operator": "=", "value": "Mercedes" }, { "field": "brand", "operator": "=", "value": "BMW" } ] } ]y escriba una función que transforme este JSON como una consulta de MongoDB para que pueda filtrar directamente los datos mientras lee de MongoDb (usaré estos datos dentro de la función ReadFromMongoDB de apache beam, como objeto de filtro)
por lo que la salida debería ser como:
{'$and': [{'field': 'model', 'operator': '>', 'value': '2005'}, { '$or': [ {'field': 'brand', 'operator': '=', 'value': 'Mercedes'}, {'field': 'brand', 'operator': '=', 'value': 'BMW'} ] }]}(Tengo una función que transforma cada objeto individual en una consulta MongoDB, así que no te preocupes por eso)
LO QUE INTENTÉ
Como no sé cómo vendrán los datos anidados, utilicé la recursividad en mi función. Pero se complica y la salida no es como esperaba.
def splitToItems(query, items={}): if 'and' in query: for item in query['and']: if 'and' in item or 'or' in item: splitToItems(item) else: if '$and' not in items: items['$and'] = [item] # print(items) else: items['$and'].append(item) # print(items) if 'or' in query: for item in query['or']: if 'and' in item or 'or' in item: return splitToItems(item) else: if '$or' not in items: items['$or'] = [item] # print(items) else: items['$or'].append(item) # print(items) print(items) ------- OUTPUT: # '$or' should have been inside of the first array in this case { '$and': [{'field': 'model', 'operator': '>', 'value': '2005'}], '$or': [{'field': 'brand', 'operator': '=', 'value': 'Mercedes'}, {'field': 'brand', 'operator': '=', 'value': 'BMW'}] }¿Alguna idea sobre cómo mejorar esta función o hacer que funcione? Muchas gracias de antemano
Espero haber entendido bien la pregunta
def splitToItems(query, items={}): q = {} if 'and' in query: l = [] for item in query['and']: l.append(splitToItems(item)) q["$and"] = l if 'or' in query: l = [] for item in query['or']: l.append(splitToItems(item)) q["$or"] = l if q: return q return query print(splitToItems(query))¿Esto resuelve tu problema?