У меня есть структура 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», и не добавлю запросы вместе.