在 Mongo-go-driver 中创建一个唯一字段
Making a unique field in Mongo-go-driver
我对 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 随机生成的字符串,并且不是实际的主机名字符串值。
我有什么办法可以做到这一点。
您可以使用 unique index 强制/只允许给定字段的不同值,例如:
db.collectionname.createIndex( { "hostname": 1 }, { unique: true } )
如果你想使用官方 MongoDB 驱动程序创建这样的索引,你可以这样做:
indexName, err := coll.Indexes().CreateOne(
context.Background(),
mongo.IndexModel{
Keys: bson.D{{Key: "hostname", Value: 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
.
中
我对 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 随机生成的字符串,并且不是实际的主机名字符串值。
我有什么办法可以做到这一点。
您可以使用 unique index 强制/只允许给定字段的不同值,例如:
db.collectionname.createIndex( { "hostname": 1 }, { unique: true } )
如果你想使用官方 MongoDB 驱动程序创建这样的索引,你可以这样做:
indexName, err := coll.Indexes().CreateOne(
context.Background(),
mongo.IndexModel{
Keys: bson.D{{Key: "hostname", Value: 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
.