在 Mongo-go-driver 中创建一个独特的领域

Roh*_*hit 2 go mongodb bson mongo-go

我对 Go 和 Mongodb 都很陌生,正在用 Go 和 Mongo 编写我的第一个 rest-api。我正在使用mongo-go-driverModal在 Go 中有以下结构

type Modal struct {
    Group     []string           `bson:"group" json:"group"`
    Hostname  string             `bson:"hostname" json:"hostname"`
    Overrides map[string]string  `bson:"overrides" json:"overrides"`
    Excludes  []string           `bson:"excludes" json:"excludes"`
}
Run Code Online (Sandbox Code Playgroud)

我不想使用ObjectIdmongo-db 提供的默认字段作为我的主键,而是希望将该Hostname字段作为主键。

如果我将Hostname字段的类型设置为primitive.ObjectID,那么hostname它将是唯一的,但它的值将由 mongodb 随机生成的字符串而不是实际的主机名字符串值。

那么有没有办法做到这一点。

icz*_*cza 9

您可以使用唯一索引来强制/只允许给定字段的不同值,例如:

db.collectionname.createIndex( { "hostname": 1 }, { unique: true } )
Run Code Online (Sandbox Code Playgroud)

如果您想使用官方 MongoDB 驱动程序创建此类索引,您可以这样做:

indexName, err := coll.Indexes().CreateOne(
    context.Background(),
    mongo.IndexModel{
        Keys:    bson.D{{Key: "hostname", Value: 1}},
        Options: options.Index().SetUnique(true),
    },
)
Run Code Online (Sandbox Code Playgroud)

但是要知道在 MongoDB 中每个文档都必须有一个_id属性,因此执行上述操作,文档将具有一个自动生成的_id字段(ObjectId类型)。如果这不打扰你,你就完成了。

另请注意,您可以使用结构标记映射Modal.Hostname_id字段:

type Modal struct {
    Group     []string           `bson:"group" json:"group"`
    Hostname  string             `bson:"_id" json:"hostname"`
    Overrides map[string]string  `bson:"overrides" json:"overrides"`
    Excludes  []string           `bson:"excludes" json:"excludes"`
}
Run Code Online (Sandbox Code Playgroud)

再一次,你完成了。此解决方案的缺点是 MongoDB 中的文档没有名为 的属性hostname,因为它将存储在_id.