下面是我的模塊代碼
你可以go get github.com/yihubaikai/gopublic/mongo
里面下載
package mongo
import (
"fmt"
"github.com/yihubaikai/gopublic"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
//"log"
)
//單條數據節點
type DataNode struct {
Nick string `json:"nick"`
Class string `json:"class"`
Flag int `json:"flag"`
Starttime string `json:"starttime"`
}
type Person struct {
NAME string
PHONE string
}
type Men struct {
Persons []Person
}
var session *mgo.Session
var database *mgo.Database = nil
// get mongodb
//db: data
//host: 127.0.0.1
//
func GetDB() *mgo.Database {
if database == nil {
session, err := mgo.Dial("127.0.0.1:27017")
if err != nil {
panic(err)
}
//defer session.close()
session.SetMode(mgo.Monotonic, true)
database = session.DB("data")
return database
} else {
return database
}
/*
var err error
dialInfo := &mgo.DialInfo{
Addrs: []string{config.Hosts},
Direct: false,
Timeout: time.Second * 1,
PoolLimit: 4096, // Session.SetPoolLimit }
//創建一個維護套接字池的session
session, err = mgo.DialWithInfo(dialInfo)
if err != nil {
log.Println(err.Error())
}
session.SetMode(mgo.Monotonic, true)
//使用指定數據庫
database = session.DB(config.Database)
*/
}
//插入記錄
func Insert(db *mgo.Database, item, nick, class string) bool {
c := db.C(item)
//defer c.Close()
//result := DataNode{}
err, _ := c.Upsert(bson.M{"nick": nick}, &DataNode{Nick: nick, Class: class, Flag: 0, Starttime: hPub.Gettime()})
if err != nil {
fmt.Println("添加記錄成功:", item, nick, class, hPub.Gettime())
return true
} else {
fmt.Println("更新記錄成功:", item, nick, class, hPub.Gettime())
return true
}
//fmt.Println(rs)
return true
}
//獲取記錄
func GetOne(db *mgo.Database, item string, find, update int) (nick, class string) {
nick = ""
class = ""
c := db.C(item)
result := DataNode{}
err := c.Find(bson.M{"flag": find}).One(&result)
if err == nil {
fmt.Println("nick", result.Nick, "class", result.Class)
nick = result.Nick
class = result.Class
//獲取記錄了之后更新一下記錄
//err = c.Update(bson.M{"nick": nick}, bson.M{"$set": bson.M{"flag": 2, "starttime": hPub.Gettime()}})
changeInfo, err := c.UpdateAll(bson.M{"nick": nick}, bson.M{"$set": bson.M{"flag": update}})
if err == nil {
fmt.Println("獲取記錄:更新記錄成功:", changeInfo)
} else {
fmt.Println("獲取記錄:更新記錄失敗:", changeInfo)
}
} else {
fmt.Println("獲取記錄失敗")
}
return nick, class
}
//--------------------------------------------------------------------
//插入單條數據
func Insert2(db *mgo.Database) {
//db := GetDB()
c := db.C("user")
type User struct {
Name string "bson:`name`"
Age int "bson:`age`"
}
err := c.Insert(&User{Name: "Tom", Age: 20})
if err != nil {
panic(err)
}
fmt.Println(err)
}
func Insert3(db *mgo.Database, item, nick, class string) bool {
c := db.C(item)
result := DataNode{}
err := c.Find(bson.M{"nick": nick}).One(&result)
if err != nil {
//err := c.Upsert(&DataNode{Nick: nick, Class: class, Flag: 0, Starttime: hPub.Gettime()})
err, _ := c.Upsert(bson.M{"nick": nick}, &DataNode{Nick: nick, Class: class, Flag: 0, Starttime: hPub.Gettime()})
if err != nil {
fmt.Println("添加記錄成功:", item, nick, class, hPub.Gettime())
return true
} else {
fmt.Println("更新記錄成功:", item, nick, class, hPub.Gettime())
return true
}
} else {
fmt.Println("可能存在")
return true
}
}
//一次插入多條記錄
func insertMuti() {
db := GetDB()
c := db.C("user")
type User struct {
Name string "bson:`name`"
Age int "bson:`age`"
}
err := c.Insert(&User{Name: "Tom", Age: 20}, &User{Name: "Anny", Age: 28})
if err != nil {
panic(err)
}
fmt.Println(err)
}
//插入數組格式數據
func insertArray() {
db := GetDB()
c := db.C("user")
type User struct {
Name string "bson:`name`"
Age int "bson:`age`"
Groups []string "bson:`groups`"
}
err := c.Insert(&User{
Name: "Tom",
Age: 20,
Groups: []string{"news", "sports"},
})
if err != nil {
panic(err)
}
fmt.Println(err)
}
//插入嵌套數據
func insertNesting() {
db := GetDB()
c := db.C("user")
type Toy struct {
Name string "bson:`name`"
}
type User struct {
Name string "bson:`name`"
Age int "bson:`age`"
Toys []Toy
}
err := c.Insert(&User{
Name: "Tom",
Age: 20,
Toys: []Toy{{Name: "dog"}},
})
if err != nil {
panic(err)
}
fmt.Println(err)
}
//插入map格式的數據
func insertMap() {
db := GetDB()
c := db.C("user")
user := map[string]interface{}{
"name": "Tom",
"age": 20,
"groups": []string{"news", "sports"},
"toys": []map[string]interface{}{
{
"name": "dog",
},
},
}
err := c.Insert(&user)
if err != nil {
panic(err)
}
fmt.Println(err)
}
//插入關聯其它集合ObjectId的數據
//要使用bson.ObjectIdHex函數對字符串進行轉化,bson.ObjectIdHex函數原型
func insertObjectId() {
db := GetDB()
c := db.C("user")
user := map[string]interface{}{
"name": "Tom",
"age": 20,
"group_id": bson.ObjectIdHex("540046baae59489413bd7759"),
}
err := c.Insert(&user)
if err != nil {
panic(err)
}
fmt.Println(err)
}
func QueryOne() {
db := GetDB()
c := db.C("user")
//*****查詢單條數據*******
result := Person{}
err := c.Find(bson.M{"NAME": "456"}).One(&result)
if err != nil {
panic(err)
}
fmt.Println("Phone:", result.NAME, result.PHONE)
}
func QueryMutil() {
db := GetDB()
c := db.C("user")
//*****查詢多條數據*******
result := Person{}
var personAll Men //存放結果
iter := c.Find(nil).Iter()
for iter.Next(&result) {
fmt.Printf("Result: %v\n", result.NAME)
personAll.Persons = append(personAll.Persons, result)
}
}