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

问题描述 投票:1回答:1

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

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"`
}

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

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

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

mongodb go bson mongo-go
1个回答
1
投票

您可以使用unique index强制/仅允许给定字段的不同值,例如:

db.collectionname.createIndex( { "hostname": 1 }, { unique: true } )

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

indexName, err := coll.Indexes().CreateOne(
    context.Background(),
    IndexModel{
        Keys   : bsonx.Doc{{"hostname", bsonx.Int32(1)}},
        Options: options.Index().SetUnique(true),
    },
)

但是要知道在MongoDB中每个文档都必须有一个_id属性,所以做到这一点,文档将有一个自动生成的_id字段(ObjectId类型)。如果这不打扰你,你就完成了。

另请注意,您可以使用struct标签将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"`
}

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

© www.soinside.com 2019 - 2024. All rights reserved.