Skip to content

Instantly share code, notes, and snippets.

@asm-jaime
Last active December 24, 2017 04:58
Show Gist options
  • Save asm-jaime/bb42ccfaa2a0c291d63ca89a2b324c8c to your computer and use it in GitHub Desktop.
Save asm-jaime/bb42ccfaa2a0c291d63ca89a2b324c8c to your computer and use it in GitHub Desktop.
go mgo mongodb+test example, test insert same data to unique key
package main
import (
mgo "gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
"time"
)
// ========== model
type Cargo struct {
Id bson.ObjectId `form:"id" bson:"_id,omitempty"`
Value string `form:"value" bson:"value"`
}
// ========== mongo
type MongoDB struct {
Host string
Port string
Addrs string
Database string
EventTTLAfterEnd time.Duration
StdEventTTL time.Duration
Info *mgo.DialInfo
Session *mgo.Session
}
func ConfigureMongo(mongo *MongoDB) (err error) {// {{{
mongo.Port = "27017"
mongo.Host = "localhost"
mongo.Addrs = mongo.Host + ":" + mongo.Port
mongo.Database = "test"
mongo.EventTTLAfterEnd = 1 * time.Second
mongo.StdEventTTL = 20 * time.Minute
mongo.Info = &mgo.DialInfo{
Addrs: []string{mongo.Addrs},
Timeout: 60 * time.Second,
Database: mongo.Database,
}
// first connect, and next requests only clones this session
mongo.Session, err = mgo.DialWithInfo(mongo.Info)
if err != nil {
mongo.Session, err = mgo.Dial(mongo.Host)
}
return err
}
func (mongo *MongoDB) Drop() (err error) {
session := mongo.Session.Clone()
defer session.Close()
err = session.DB(mongo.Database).DropDatabase()
return err
}
func (mongo *MongoDB) Init() (err error) {
session := mongo.Session.Clone()
defer session.Close()
session.EnsureSafe(&mgo.Safe{})
collection := session.DB(mongo.Database).C("cargo")
index := mgo.Index{
Key: []string{"value"},
Unique: true,
Background: true,
Sparse: true,
}
err = collection.EnsureIndex(index)
return err
}
// ========== methods
func (mongo *MongoDB) GetCargo() (cargos []Cargo, err error) {
session := mongo.Session.Clone()
defer session.Close()
err = session.DB(mongo.Database).C("cargo").Find(bson.M{}).All(&cargos)
return cargos, err
}
func (mongo *MongoDB) PostCargo(cargo *Cargo) (err error) { // {{{
session := mongo.Session.Clone()
defer session.Close()
err = session.DB(mongo.Database).C("cargo").Insert(&cargo)
return err
}
package main
import (
gen "github.com/asm-jaime/gen"
"testing"
)
func dbTest() (mongo *MongoDB) {
mongo = &MongoDB{}
err := ConfigureMongo(mongo)
if err != nil {
panic("db does not allow set any session. \n" +
"here is a problem with config params or database")
}
err = mongo.Drop()
if err != nil {
panic("db does not allow drop.")
}
err = mongo.Init()
if err != nil {
panic("db does not allow init.")
}
return mongo
}
func Test2xSamePost(t *testing.T) {
db := dbTest()
cargo := Cargo{}
cargo.Value = gen.StrNums(8)
err := db.PostCargo(&cargo)
if err != nil {
t.Error("first insert err: ", err)
}
err = db.PostCargo(&cargo)
if len(err.Error()) > 6 && err.Error()[0:6] == "E11000" {
// fmt.Println(err)
} else {
t.Error("this err is not proper error, ", err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment