mongo go if [] is empty 认为它是 false

mongo go if [] is empty deem it as false

目前,如果用户有一个订阅对象,但它是空的,即 [],那么它不会被视为 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},
        })
    }

}

这是通话发生的地方。 目前,如果我将任一管道查询选项附加到管道,它 returns 没有对象。我还有其他简单的 $match 管道查询在工作。

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

如果 subscriptions 字段在数据库中是可选的,那么如果你想过滤带有订阅的文档,你必须通过 subscriptions 存在并且它的大小大于 0 来过滤(大于零条件就足够了,因为这只能在字段存在的情况下)。同样,如果您想要没有订阅的文档,则必须按 non-existent 或其大小等于 0.

进行过滤

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

所以简单地使用这个:

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