接受 json 对象的 Python 函数返回 mongodb 查询对象

Posted

技术标签:

【中文标题】接受 json 对象的 Python 函数返回 mongodb 查询对象【英文标题】:Python function that takes a json object returns mongodb query object 【发布时间】:2021-06-09 19:56:23 【问题描述】:

我需要取一个JSON(过滤数据的条件),示例数据:

query =  "and": [
    
      "field": "model",
      "operator": ">",
      "value": "2005"
    ,
    
      "or": [
        
          "field": "brand",
          "operator": "=",
          "value": "Mercedes"
        ,
        
          "field": "brand",
          "operator": "=",
          "value": "BMW"
        
      ]
    
  ]

并编写一个函数,将此 JSON 转换为 MongoDB 查询,以便在从 MongoDb 读取时直接过滤数据(我将在 apache beam ReadFromMongoDB 函数中使用此数据,作为过滤器对象)

所以输出应该是这样的:

'$and': ['field': 'model', 'operator': '>', 'value': '2005', 
 '$or': [
     'field': 'brand', 'operator': '=', 'value': 'Mercedes',
     'field': 'brand', 'operator': '=', 'value': 'BMW'
    ]
 ]

(我有一个函数可以将每个对象转换为 MongoDB 查询,所以不用担心)

我尝试了什么

由于我不知道嵌套数据是如何产生的,所以我在函数中使用了递归。但它变得复杂,输出不符合我的预期。

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']


关于如何改进此功能或使其工作的任何想法?非常感谢提前

【问题讨论】:

【参考方案1】:

希望我能正确理解这个问题

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))

这能解决您的问题吗?

【讨论】:

是的!非常感谢

以上是关于接受 json 对象的 Python 函数返回 mongodb 查询对象的主要内容,如果未能解决你的问题,请参考以下文章

Python_类型转换函数

关于eval()函数处理后台返回的json数据

JSON-P 回调函数是不是应该接受字符串?

python json转html

php 接口参数对象转数组方法

FastAPI接受post上传JSON对象BaseModel,python