You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:00:57