登录
首页 >  Golang >  Go问答

mongo go 如果为空则视为 false

来源:stackoverflow

时间:2024-04-07 20:00:34 184浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《mongo go 如果为空则视为 false》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

目前,如果用户有一个订阅对象,但它是空的,即[],那么它不会被视为订阅= false。

// hasactivesubscriptions
hassubscriptions := c.queryparam("hassubscriptions")
if hassubscriptions != "" {

    hassubscriptions = strings.toupper(hassubscriptions)
    if hassubscriptions != "true" && hassubscriptions != "false" {
        fmt.println("hassubscriptions query param is an invalid value")
    }
    res, err := strconv.parsebool(hassubscriptions)
    if err != nil {
        fmt.println(err)
    }
            if res {
        pipeline = append(pipeline, bson.m{
            "$match": bson.m{
                "subscriptions": bson.m{"$ne": nil},
            },
        })
    } else {
        pipeline = append(pipeline, bson.m{
            "$match": bson.m{"subscriptions": nil},
        })
    }

}

这是调用发生的地方。 目前,如果我将任一管道查询选项附加到管道,它不会返回任何对象。我还有其他简单的 $match 管道查询正在运行。

cur, err := collection.Aggregate(ctx, pipeline)
if err != nil {
    return c.String(http.StatusNotFound, "No users found")
}

解决方案


如果 subscriptions 字段在数据库中是可选的,那么如果您想过滤具有订阅的文档,则必须通过 subscriptions 是否存在且其大小大于 0 进行过滤(大于零条件就足够了,因为这只能是如果该字段存在)。同样,如果您想要没有订阅的文档,则必须根据其不存在或其大小等于 0 进行过滤。

更简单的方法是测试第一个数组元素是否存在。仅当 subscriptions 存在且其大小大于 subscriptions 时,第一个数组元素才能存在,如果第一个元素不存在,则 subscriptions 不存在或为空。

所以只需使用这个:

pipeline = append(pipeline, bson.M{
    "$match": bson.M{
        "subscriptions.0": bson.M{"$exists": res},
    },
})

以上就是《mongo go 如果为空则视为 false》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>