
mgo 的 Collection.Find() 方法仅接受单个查询条件参数,不能传入多个独立的 bson.M 对象;将多个条件合并为一个复合查询对象即可解决“too many arguments”错误。
mgo 的 `collection.find()` 方法仅接受单个查询条件参数,不能传入多个独立的 `bson.m` 对象;将多个条件合并为一个复合查询对象即可解决“too many arguments”错误。
在使用 mgo(v2)驱动操作 MongoDB 时,Collection.Find() 方法的签名是 func (c *Collection) Find(query interface{}) *Query,只支持一个参数——即一个完整的查询文档(如 bson.M)。你原代码中:
colQuerier := bson.M{"company_name": "bank"}
match := bson.M{"process": bson.M{"$elemMatch": bson.M{"process.process_name":"Converted"}}}
err := c.Find(colQuerier, match).Sort("-id").All(&results) // ❌ 错误:传入了两个参数
此处 c.Find(colQuerier, match) 实际向 Find 传递了两个 bson.M 参数,Go 编译器直接报错:“too many arguments in call to c.Find”。
✅ 正确做法是将所有查询条件合并到同一个 bson.M 对象中,利用 MongoDB 的隐式 $and 逻辑组合多条件。针对你的文档结构(嵌套数组 process 中需匹配 process_name == "Converted"),正确写法如下:
query := bson.M{
"company_name": "bank",
"process": bson.M{
"$elemMatch": bson.M{
"process_name": "Converted", // 注意:字段名是 process_name,不是 process.process_name
},
},
}
err := c.Find(query).Sort("-_id").All(&results) // ✅ 单参数调用;另注意排序字段应为 "_id" 而非 "id"
if err != nil {
log.Fatal(err)
}
⚠️ 关键注意事项:
- "$elemMatch" 内部的字段名必须是数组元素的直接字段名(如 "process_name"),而非带路径的 "process.process_name" —— 后者是无效语法,会导致查询始终不匹配;
- 排序字段应写为 "-_id"(MongoDB 默认 _id 字段),"-id" 会静默忽略排序;
- 若需同时满足多个数组元素条件(例如 process_name=="Converted" 且 processtype==1),仍应在 $elemMatch 内用 bson.M 组合,如:bson.M{"process_name": "Converted", "processtype": 1};
- mgo 已归档(推荐迁移到官方 mongo-go-driver),但若项目仍在维护,务必确保查询结构严格符合 BSON 文档规范。
总结:始终牢记 Find() 是单参数方法;复杂查询 = 单个 bson.M,通过嵌套 $elemMatch、$and、$or 等操作符组织逻辑,而非拆分参数。











