Golang строит монго-запрос из структуры вложенной карты - PullRequest
3 голосов
/ 16 апреля 2019

У меня есть структура Json, как показано ниже.

{  
 "type":"LogicalExpression",
 "operator":"&&",
 "left":{  
   "type":"BinaryExpression",
  "operator":">",
  "left":{  
     "name":"stage3_num1",
     "type":"Identifier"
  },
  "right":{  
     "value":50,
     "raw":"50",
     "type":"Literal"
  }
 },
 "right":{  
  "type":"LogicalExpression",
  "operator":"||",
  "left":{  
     "type":"BinaryExpression",
     "operator":">",
     "left":{  
        "name":"stage3_num2",
        "type":"Identifier"
     },
     "right":{  
        "type":"Literal",
        "value":200,
        "raw":"200"
     }
  },
  "right":{  
     "type":"BinaryExpression",
     "operator":"<=",
     "left":{  
        "type":"Identifier",
        "name":"stage3_num3"
     },
     "right":{  
        "value":2000,
        "raw":"2000",
        "type":"Literal"
     }
   }
 }
}

Я хочу построить запрос Монго из вышеприведенной структуры, где «оператор» обозначает двоичное или логическое выражение, а «левый», «правый» обозначает поля и значение.Но я не могу обработать логическое выражение внутри логического выражения в бесконечном цикле.Любые идеи, предложения по решению будут большой помощью.

Редактировать:

    query := bson.M{}
    filter := jsonmap
        for key, val := range filter {
            if key == "type" && val == "BinaryExpression" {
                a := sel(filter)
                query = a
            } else if key == "type" && val == "LogicalExpression" {
                mongoparam := GetmongoParam(query["operator"].(string))
                query[mongoparam] = []bson.M{}
                //Further operations..
            }
        }

Где sel - это func -

func sel(query map[string]interface{}) bson.M {
    result := make(bson.M, len(query))
    mongoparam := GetmongoParam(query["operator"].(string))
    var left string
    var right interface{}
    md, ok := query["left"].(map[string]interface{})
    if ok {
        if md["type"] == "Identifier" {
            left = md["name"].(string)
        }
    }
    rd, ok := query["right"].(map[string]interface{})
    if ok {
        if rd["type"] == "Identifier" {
            right = rd["name"]
        } else {
            right = rd["value"]
        }
    }
    result[left] = bson.M{mongoparam: right}
    return result
}

Iя просто не могу продолжить работу с вложенными картами и не могу выполнить итерацию до тех пор, пока «type» не станет «LogicalExpression», и не добавлю запросы вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...