gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:11:47 25 4
gpt4 key购买 nike

我正在尝试使用 Go 接口(interface)进行动态 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
}

谁能向我解释为什么使用接口(interface)不起作用以及如何动态编写这个函数?

按照建议修改函数以使用 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 吗?

最佳答案

您需要 执行索引 如果需要,请执行 类型类型转换 也是。

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

关于mongodb - 如何使用 interface{} 动态查询 mongodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59766129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com