MongoDB更新文档内嵌数组指定对象时错误修改顶层字段问题排查
问题原因
- 更新操作缺少
$set操作符:你直接传入Changes结构体作为更新参数时,Mongo会默认将结构体序列化后的字段当做顶层文档字段直接覆盖,因此直接修改了顶层的count字段,而非数组内的嵌套字段。 - 未指定数组元素的定位路径:要更新数组中匹配到的元素,需要使用MongoDB的数组位置运算符
$,它会自动匹配查询条件中筛选到的schools数组元素的下标,你需要明确指定更新路径为schools.$.count才能命中数组内部的字段。 - 可选修正项:你当前的查询条件中
id和schools.id都写为了字符串类型,如果实际文档中这两个字段是数值类型,会导致查询匹配失效,需要和文档中的字段类型保持一致。
正确写法示例
使用官方mongo-go-driver的正确代码如下:
// 查询条件保持和文档字段类型一致 query := bson.M{ "id": 3737737, "schools.id": 11233, } // 用$set指定嵌套更新路径,$占位符指向匹配到的schools数组元素 update := bson.M{ "$set": bson.M{ "schools.$.count": 900, }, } // 执行单条更新 err := col.UpdateOne(context.TODO(), query, update)
如果你希望继续使用自定义的Changes结构体,只需调整结构体的bson标签即可:
type Changes struct { Count int `bson:"schools.$.count"` } update := bson.M{ "$set": Changes{Count: 900}, } err := col.UpdateOne(context.TODO(), query, update)
内容的提问来源于stack exchange,提问作者shekwo
相关产品推荐
相关产品推荐

