如何使用界面动态查询mongodb {}

时间:2020-01-16 09:04:04

标签: mongodb go

我正尝试使用Go界面进行动态mongodb查询,如下所示

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参数匹配的值。 当我在下面的代码中使用整数和字符串等其他类型时,一切正常。

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 $或类似以下代码的逻辑

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
}

逻辑$ or不起作用。仅当我的FindIp输入匹配

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

,但是即使将类型转换设置为args,其他输入也无法使用 知道在这种情况下如何使用mongodb逻辑$ or吗?

1 个答案:

答案 0 :(得分:1)

您需要执行索引,并且如果需要,还可以进行类型转换

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

OR

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