简体   繁体   中英

Making a unique field in Mongo-go-driver

I am very new to both Go and Mongodb and was writing my first rest-api with Go and Mongo. I am using mongo-go-driver and have the following Modal struct in 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"`
}

I do not want to use the default ObjectId field provided by mongo-db as my primary key and instead would like to make the Hostname field as the primary key.

If I make the type of Hostname field as primitive.ObjectID , then the hostname would be unique but its value will be randomly generated string by mongodb and not the actual hostname string value.

So is there a way I can do this.

You may use a unique index to enforce / allow only distinct values of a given field, eg:

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

If you want to create such index using the official MongoDB driver, this is how you can do that:

indexName, err := coll.Indexes().CreateOne(
    context.Background(),
    mongo.IndexModel{
        Keys:    bson.D{{Key: "hostname", Value: 1}},
        Options: options.Index().SetUnique(true),
    },
)

But know that in MongoDB each document must have an _id property, so doing the above, documents will have an auto-generated _id field (of ObjectId type). If this doesn't bother you, you're done.

Also note that you may map Modal.Hostname to the _id field with struct tags:

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

And again, you're done. The downside of this solution is that the documents in MongoDB will not have a property named hostname , as it will be stored in _id .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM