Как динамически запрашивать mongodb с помощью интерфейса {} - PullRequest
1 голос
/ 16 января 2020

Я пытаюсь создать динамический c mongodb-запрос с использованием интерфейса Go, как показано ниже

func (m *NfInstanceDataAccess) FindIp(preferredNfInstances string, args ...interface{}) ([]model.NfProfile, bool) {
    var ip []model.NfProfile
    pipeline := bson.M{"nfType": preferredNfInstances, "allowedNssais.sst": args, "allowedNssais.sd": args}
    filter := bson.M{"ipv4Addresses": true}
    err := db.C(COLLECTION).Find(pipeline).Select(filter).All(&ip)
    if err != nil {
        return ip, false
    }
    return ip, true
}

Нет ошибки при использовании функции в моем обработчике http-сервера как

    nfInstanceIp, success := Da.FindIp(targetNfType, sst, sd)
            if !success {
                WriteError(response, ErrInternalServer)
                return
            }

но ответ nfInstanceIp всегда пуст, хотя в моей коллекции mongodb есть значения, соответствующие аргументам FindIp. Когда я использую другие типы, такие как integer и string, как в приведенном ниже коде, все работает.

func (m *NfInstanceDataAccess) FindIp(preferredNfInstances string, sst int, sd string) ([]model.NfProfile, bool) {
    var ip []model.NfProfile
    pipeline := bson.M{"nfType": preferredNfInstances, "allowedNssais.sst": sst, "allowedNssais.sd": sd}
    filter := bson.M{"ipv4Addresses": true}
    err := db.C(COLLECTION).Find(pipeline).Select(filter).All(&ip)
    if err != nil {
        return ip, false
    }
    return ip, true
}

Может кто-нибудь объяснить мне причину, по которой не работает интерфейс, и как динамически писать эту функцию?

Изменение функции в соответствии с предложением использовать mongodb $ или logi c, как показано в коде ниже

func (m *NfInstanceDataAccess) FindIp(preferredNfInstances string, args ...interface{}) ([]model.NfProfile, bool) {
    var ip []model.NfProfile
    pipeline := bson.M{
        "nfType": preferredNfInstances,
        "$or": []interface{}{
            bson.M{"sNssais.sst": args[0].(int32), "sNssais.sd": args[1].(string)},
            bson.M{"amfInfo.taiList.tac": args},
            bson.M{"smfInfo.taiList.tac": args},
            bson.M{"upfInfo.taiList.tac": args},
        },
    }
    filter := bson.M{"ipv4Addresses": true}
    err := db.C(COLLECTION).Find(pipeline).Select(filter).All(&ip)
    if err != nil {
        return ip, false
    }
    return ip, true
}

Логический $ или не работает. Это работает только тогда, когда мой ввод FindIp совпадает с

bson.M{"sNssais.sst": args[0].(int32), "sNssais.sd": args[1].(string)}

, но другие входные данные не работают, даже если установить приведение типа к аргументам. Есть идеи, как я могу использовать логический $ mongodb или в этом случае?

1 Ответ

1 голос
/ 16 января 2020

Вам необходимо выполнить индексацию и, если необходимо, также выполнить кастинг *1004*.

pipeline := bson.M{"nfType": preferredNfInstances, "allowedNssais.sst": args[0].(int), "allowedNssais.sd": args[1].(string)}

ИЛИ

pipeline := bson.M{"nfType": preferredNfInstances, "allowedNssais.sst": args[0], "allowedNssais.sd": args[1]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...