使用Golang与bson查询friends数组含指定ObjectId的用户时报$in needs an array错误
报错根源
$in是MongoDB的集合匹配类操作符,强制要求传入的匹配值必须是数组结构。你当前代码中直接把单个primitive.ObjectID类型的id传给了$in,本质是传入了标量值而非合法的数组参数,完全不符合操作符的语法规则,因此触发$in needs an array的BadValue类报错。
对应解决方法
根据实际业务场景选择适配的写法即可:
- 场景1:仅需要匹配
friends数组中包含单个指定好友ID的用户
这类场景完全不需要使用$in操作符。MongoDB对数组字段的等值匹配做了原生支持:当你对数组字段传入单值做等于判断时,会自动校验数组内是否存在匹配的元素,写法如下:// 直接把目标ObjectID作为friends字段的匹配值 filter := bson.M{"friends": targetObjectID} cursor, err := GetDB().Collection(UserCollection).Find(ctx, filter) - 场景2:需要匹配
friends数组中包含多个指定好友ID任意一个的用户
这类场景才适合使用$in,需要把所有待匹配的目标ID提前整理为[]primitive.ObjectID类型的切片传入,不能直接传单值,写法如下:// 待匹配的ID列表,提前整理为ObjectID切片 targetFriendIDList := []primitive.ObjectID{id1, id2, id3} filter := bson.M{"friends": bson.M{"$in": targetFriendIDList}} cursor, err := GetDB().Collection(UserCollection).Find(ctx, filter)
常见踩坑提示
实际开发中很容易踩这个坑:不少人误以为单个值匹配也需要套$in,甚至直接把单值传入$in参数,这种写法无论用哪种语言的MongoDB驱动都是非法的。$in的设计语义是「字段值落在传入的候选值集合内」,候选集合天然需要是数组结构。
内容的提问来源于stack exchange,提问作者Malcolmn Roberts
相关产品推荐
相关产品推荐

