Roh*_*hit 2 go mongodb bson mongo-go
我对 Go 和 Mongodb 都很陌生,正在用 Go 和 Mongo 编写我的第一个 rest-api。我正在使用mongo-go-driver并Modal在 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 随机生成的字符串而不是实际的主机名字符串值。
那么有没有办法做到这一点。
您可以使用唯一索引来强制/只允许给定字段的不同值,例如:
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.
| 归档时间: |
|
| 查看次数: |
4742 次 |
| 最近记录: |