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, e.g.:
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
.