如何解决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 举报,一经查实,本站将立刻删除。