微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mongo go如果[]为空,则将其视为false

如何解决mongo go如果[]为空,则将其视为false

当前,如果用户一个subscriptions对象,但它为空,即[],则不会将其视为subscriptions = 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存在并且其大小大于0时,第一个数组元素才能存在;如果第一个元素不存在,则subscriptions不存在或为空。 / p>

因此只需使用此:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。