Go mgo получить тип поля

Я создаю API в Go, используя MongoDB и mgo в качестве механизма хранения. Я написал своего рода абстракцию для запросов GET, позволяющую пользователю фильтровать результаты по полям в параметрах строки запроса, но это работает только для строковых полей.

Я ищу способ получить тип поля только с именем поля, чтобы привести параметр к правильному типу перед поиском в коллекции. Вот код:

func (db *DataBase) GetByFields(fields *map[string]interface{}, collection string) ([]DataModel, error) {
    var res []interface{}

    Debug("Getting " + collection + " by fields: ")
    for i, v := range *fields {
        Debug("=> " + i + " = " + v.(string))
        // Here would be the type checking
    }

    if limit, ok := (*fields)["limit"]; ok {
        limint, err := strconv.Atoi(limit.(string))
        if err != nil {...} // Err Handling
        delete(*fields, "limit")
        err = db.DB.C(collection).Find(fields).Limit(limint).All(&res)
        if err != nil {...} // Err Handling
    } else {
        err := db.DB.C(collection).Find(fields).All(&res)
        if err != nil {...} // Err Handling
    }

    resModel := ComputeModelSlice(res, collection)
    return resModel, nil
}

С mongodb я могу проверить тип с помощью:

db.getCollection('CollectionName').findOne().field_name instanceof typeName

Но я не могу найти способ выполнить это с помощью mgo. Есть идеи?


person JM445    schedule 18.04.2017    source источник


Ответы (1)


Я не знаю, как получить тип поля перед выполнением запроса, но one подход состоит в том, чтобы просто запросить bson.M, а затем выполнить определение типа для полученных значений:

var res bson.M
// ...
err = db.DB.C(collection).Find(fields).Limit(limint).All(&res)
// ...
for key, val := range res {
  switch val.(type) {
  case string:
    // handle
  case int:
    // handle
  // ...
  default:
    // handle
  }
}
person John Weldon    schedule 18.04.2017