Reputation: 4929
I'm currently starting with GoLang and MongoDB.I'm writing a small web application, a blog to be more specific (which is like the first webapp I write when I try new languages). Everything works fine with MGO even if I had some troubles at first. But now I'd like to access each blog entry (articles will be referred as entries to stick with my models) separately. I could use the ObjectID in the url. But that's damn ugly. For example :
mydomain.com/entries/543fd8940e82533995000002/
That's not user friendly. I did a lot of research on the internet to find a suitable solution, because using any other database engine I could just use the id (and that would be fine).
Could someone help me with the creation of a custom (public) id which would auto-increment when I insert a new entry and that I could use in the url ?
Here is the code of my model for now :
package models
import (
"time"
"labix.org/v2/mgo"
"labix.org/v2/mgo/bson"
)
type (
Entries []Entry
Entry struct {
ID bson.ObjectId `bson:"_id,omitempty"`
Title string `bson:"title"`
Short string `bson:"short"`
Content string `bson:"content"`
Posted time.Time `bson:"posted"`
}
)
// Insert an entry to the database
func InsertEntry(database *mgo.Database, entry *Entry) error {
entry.ID = bson.NewObjectId()
return database.C("entries").Insert(entry)
}
// Find an entry by id
func GetEntryByID(database *mgo.Database, id string) (entry Entry, err error) {
bid := bson.ObjectIdHex(id)
err = database.C("entries").FindId(bid).One(&entry)
return
}
// Retrieves all the entries
func AllEntries(database *mgo.Database) (entries Entries, err error) {
err = database.C("entries").Find(nil).All(&entries)
return
}
// Retrieve all the entries sorted by date.
func AllEntriesByDate(database *mgo.Database) (entries Entries, err error) {
err = database.C("entries").Find(nil).Sort("-posted").All(&entries)
return
}
// Counts all the entries.
func CountAllEntries(database *mgo.Database) (count int, err error) {
count, err = database.C("entries").Find(nil).Count()
return
}
Upvotes: 4
Views: 8152
Reputation: 3510
As you know the _id is a mandatory field, that is automatically fill by the driver when you do not set it. This is the behavior that you have in your current application/code. You can find information about this type and its generation here: http://docs.mongodb.org/manual/reference/object-id/
However, you can create your own _id and set the value to anything that makes sense for your business.
This is why I am do not understand the following statement:
I did a lot of research on the internet to find a suitable solution, because using any other database engine I could just use the id (and that would be fine).
You can use any value you want as soon as it is unique for your collection.
About the auto-increment, MongoDB does not provide any auto increment field, so you have to implement it yourself, and call the increment from your application.
For example you create a new collection that contains your "sequences/counters": (showing shell commands not go)
{
_id : "entry",
sequence : 0
}
Then when you want an new id for your document you have first to update, with a findand modify the document you have created with a simple $inc operation
var ret = db.counters.findAndModify(
{
query: { _id: "entry" },
update: { $inc: { seq: 1 } },
new: true
}
);
You can then use the returned value into you new document as an _id.
This pattern is documented here: http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/
Upvotes: 4