首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Mongo-go-driver中创建一个唯一的字段

在Mongo-go-driver中创建一个唯一的字段
EN

Stack Overflow用户
提问于 2019-04-30 20:34:50
回答 1查看 5.4K关注 0票数 2

我对Go和Mongodb都是新手,并且正在用Go和Mongo编写我的第一个rest-api。我使用的是mongo-go-driver,在Go中有以下Modal结构

代码语言:javascript
复制
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随机生成的字符串,而不是实际的主机名字符串值。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-30 20:43:27

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

代码语言:javascript
复制
db.collectionname.createIndex( { "hostname": 1 }, { unique: true } )

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

代码语言:javascript
复制
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字段:

代码语言:javascript
复制
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中。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55921098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档