Go语言中向MongoDB的actors数组推送对象及ObjectId报错解决
Go语言MongoDB数组$push操作及
primitive.NewObjectId错误解决 问题背景
需要在Go语言中实现MongoDB数组推送逻辑:向General结构体的actors数组(最大容量20个元素)添加新对象,已知Node.js对应实现为:
{ $push: { "actors": {$sort: {_id: 1}, $each: [{"name": "test"}], $slice: -20}} }
对应的Go集合结构体定义:
type General struct { ID primitive.ObjectID `bson:"_id"` general string `bson:"general,omitempty"` Actors []struct{ ID primitive.ObjectID `bson:"_id"` name string `bson:"name,omitempty"` } }
用户编写的Go更新语句如下,运行时报错undefined: primitive.NewObjectId,但单独执行fmt.Println(primitive.NewObjectID())可正常生成ObjectID,且已导入"go.mongodb.org/mongo-driver/bson/primitive"包:
update := bson.D{{"$push", bson.D{{"actors", bson.D{{"$sort", bson.D{{"_id", 1}}}, {"$each", bson.A{bson.D{{"name", "test"}, {"_id", primitive.NewObjectId()}}}}, {"$slice", -20}}}}}}
错误原因及解决方案
错误核心
Go语言对标识符大小写严格敏感,primitive包中生成ObjectID的正确函数是NewObjectID()(末尾字母为大写D),而用户在update语句中误写为NewObjectId()(末尾字母小写d),导致编译器无法识别该函数。
修正后的代码
使用bson.D的规范写法
update := bson.D{ {"$push", bson.D{ {"actors", bson.D{ {"$sort", bson.D{{"_id", 1}}}, {"$each", bson.A{ bson.D{ {"name", "test"}, {"_id", primitive.NewObjectID()}, // 修正为大写D的NewObjectID }, }}, {"$slice", -20}, }}, }}, }
可选:使用bson.M简化结构
如果不需要严格的键顺序,使用bson.M可以让代码更易读:
update := bson.M{ "$push": bson.M{ "actors": bson.M{ "$sort": bson.M{"_id": 1}, "$each": []bson.M{{"name": "test", "_id": primitive.NewObjectID()}}, "$slice": -20, }, }, }
内容的提问来源于stack exchange,提问作者Yoni Mayer
相关产品推荐
相关产品推荐

