You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MongoDB中检查字符串长度大于0?Go语言mgo查询求助

解决mgo查询MongoDB中shopname修剪后长度大于0的记录问题

我来帮你搞定这个查询问题!你之前的写法没生效,主要是对MongoDB的查询语法细节和mgo的使用逻辑没摸透,咱们来逐个分析并给出正确方案:

先说说你之前写法的问题

  • 你的$where表达式都写错了:MongoDB的$where执行的是JavaScript代码,要处理shopname字段,得先拿到字段值,调用trim()方法去除前后空白,再判断长度。而且直接把$where嵌套在shopname的条件里是不对的,它应该作为顶层查询条件,或者用更高效的聚合表达式替代。
  • 用$regex: ".*.*"完全达不到需求:这个正则会匹配所有字符串(包括空字符串和全空白字符串),根本筛选不出你要的结果。

正确的解决方案

方案1:使用$expr(推荐,性能最优)

MongoDB 3.6及以上版本支持$expr,可以在查询中使用聚合表达式,结合$trim和$strLenCP来精准实现需求,而且不需要执行JavaScript,性能比$where好很多:

import (
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    // 其他必要导入
)

// 构建查询条件
findQuery := bson.M{
    "$expr": bson.M{
        "$gt": []interface{}{
            // 先修剪shopname的前后空白,再计算长度
            bson.M{"$strLenCP": bson.M{"$trim": bson.M{"input": "$shopname"}}},
            0,
        },
    },
}

// 执行查询(假设你已经有collection和ctx对象)
cursor, err := collection.Find(ctx, findQuery)
if err != nil {
    // 处理错误
}
defer cursor.Close(ctx)

这里的逻辑很清晰:$trim去除字符串前后的空白字符,$strLenCP计算修剪后的字符串长度(支持多字节字符),$gt判断长度是否大于0。

方案2:使用正确的$where写法(仅低版本MongoDB使用)

如果你的MongoDB版本低于3.6,不支持$expr,可以用$where,但要注意先判断字段存在,避免报错:

findQuery := bson.M{
    "$where": "this.shopname && this.shopname.trim().length > 0",
}

cursor, err := collection.Find(ctx, findQuery)
// 后续处理同上

⚠️ 注意:$where会逐文档执行JavaScript,大数据量下性能很差,尽量不用。

方案3:结合$exists和$regex的写法

如果不想用聚合表达式,也可以用正则匹配至少一个非空白字符,同时确保字段存在:

findQuery := bson.M{
    "shopname": bson.M{
        "$exists": true,
        "$regex":  `\S`, // 匹配至少一个非空白字符
    },
}

cursor, err := collection.Find(ctx, findQuery)
// 后续处理同上

这个方案的逻辑是:\S正则会匹配任何非空白字符(包括字母、数字、符号等),这样就能排除空字符串和全是空白的记录,$exists确保shopname字段存在。

总结

优先选择方案1的$expr写法,它性能最好,逻辑也最清晰。如果是老版本MongoDB,再考虑方案2或3。

内容的提问来源于stack exchange,提问作者Nikhil Joshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:15:19