为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 interface{} 动态查询 mongodb

如何使用 interface{} 动态查询 mongodb

Go
智慧大石 2022-05-05 17:45:42
我正在尝试使用 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},        },    }逻辑 $or 不起作用。只有当我的 FindIp 输入匹配时才有效bson.M{"sNssais.sst": args[0].(int32), "sNssais.sd": args[1].(string)}但即使将类型转换设置为 args,其他输入也不起作用知道如何在这种情况下使用 mongodb 逻辑 $or 吗?
查看完整描述

1 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

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

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]}


查看完整回答
反对 回复 2022-05-05
  • 1 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信