在你的代码片段中,你正在从 Redis 数据库中获取所有的 “Subscriptions” 并过滤符合条件的结果。为了使这个函数更清晰并有效地工作,我将展示如何完善 setUriListByFilter
函数,使其能够根据传入的过滤条件填充 uriList
。
完整的代码示例
以下是对你提供的代码进行扩展和优化后的实现:
import (
"github.com/go-redis/redis/v8"
"go.mongodb.org/mongo-driver/bson"
"log"
)
// 设定数据库连接
var redisDb *redis.Client // 假设你已经正确初始化了 Redis 客户端
func setUriListByFilter(filter bson.M, uriList *[]string) {
filterNfTypeResultsRaw, err := redisDb.HGetAll("Subscriptions").Result()
if err != nil {
logger.ManagementLog.Error(err)
return
}
for key, value := range filterNfTypeResultsRaw {
// 在这里解析 value(假设它是 JSON 字符串)到结构体,便于判断是否匹配条件
var subscriptionData models.NrfSubscriptionData
if err := json.Unmarshal([]byte(value), &subscriptionData); err != nil {
logger.ManagementLog.Error("Error unmarshaling data for key %s: %v", key, err)
continue // 如果解析失败,则跳过该条数据
}
// 检查 nfProfile.NfType 是否匹配
if nfType, ok := filter["reqNfType"]; ok && subscriptionData.NfType == nfType {
*uriList = append(*uriList, subscriptionData.Uri) // 假设你要提取 Uri 字段
}
}
}
调用方式
调用 setUriListByFilter
时,确保传入正确的过滤条件和一个空切片来接收结果。例如:
nfTypeCond := bson.M{"reqNfType": nfProfile.NfType}
var uriList []string
setUriListByFilter(nfTypeCond, &uriList)
// 处理 uriList,比如返回给客户端或进一步操作
说明
- Redis 获取数据:我们使用
HGetAll
方法从 Redis 中获取所有订阅信息。 - JSON 解析:因为从 Redis 返回的是字符串,所以需要将其解析为相应的数据结构(如
models.NrfSubscriptionData
),以便于访问具体字段。 - 条件匹配:通过检查传入的过滤条件来决定是否将特定的 URI 添加到结果列表中。
- 错误处理:在每一步都进行了错误处理,以确保在出现问题时可以记录并跳过有问题的数据。
这种方式让代码更加健壮,并且易于维护,同时也提高了可读性。
内容由零声教学AI助手提供,问题来源于学员提问