Go+MongoDB项目使用$in操作符传入空数组报错如何解决
Go操作MongoDB空$in参数匹配全量数据解决方案
问题根因
- 当传入的
searchedProfiles为空切片时,BSON序列化时可能将空切片转换为null,触发MongoDB报错$in needs an array - 就算空切片被正常序列化为空数组,MongoDB中
$in: []的语义是不匹配任何文档,和你需要的空参数时匹配所有结果的需求完全相反
解决方案
通过动态构造$match阶段的过滤条件实现需求:当入参切片非空时添加$in过滤,切片为空时不添加该过滤条件,相当于全量匹配。
修改后代码示例
var searchedProfiles []int // 初始化空过滤条件 searchFilter := bson.M{} // 仅当切片有有效值时添加$in过滤 if len(searchedProfiles) > 0 { searchFilter["customer.id"] = bson.M{"$in": searchedProfiles} } newQry := []bson.M{ {"$lookup": bson.M{ "localField": "cid", "from": "customers", "foreignField": "_id", "as": "customer"}}, {"$match": searchFilter}, }
补充说明
- 如果
searchFilter本身有其他固定过滤条件,直接在初始化时写入即可,动态条件判断逻辑保持不变 - 该方案无额外性能开销,空的
$match条件会被MongoDB查询优化器自动忽略 - 建议传入
$in的切片提前做去重处理,可小幅提升查询效率
内容的提问来源于stack exchange,提问作者Tarnjeet Singh
相关产品推荐
相关产品推荐

