我对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随机生成,而不是实际的主机名字符串值。
那么我有办法吗?
答案 0 :(得分: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
)。如果这不打扰您,那么您就完成了。
还要注意,您可以使用结构标签将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
中。