這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
2014-1-25
在設計mongo資料庫時遇到這樣一個問題,日誌資訊表需要引用人員資訊表的資料.如果是結構化資料庫,基本上不用想太多的東西.由於剛接觸非結構化資料庫,按著書上的理解由於日誌數量較多,如果採用嵌入式資料的話會產生太多的可變因素(不知道這樣說是不是合理,比如說人員經常在各個部門亂跳則會造成資料經常變更 ^_^!),所以需要用到引用資料方式.今天先寫了個插入資料的測試DEMO,有時間再補上個查詢.
package mainimport ("crypto/rand""encoding/hex""fmt""labix.org/v2/mgo""labix.org/v2/mgo/bson""time")var (mgoSession *mgo.SessiondatabaseName = "myDB"tbl_person = "persons"tbl_log = "logs")type Person struct {Id stringName stringInserted time.Time}type Log struct {LogId stringLog stringLogUser mgo.DBRefInserted time.Time}func main() {session, err := mgo.Dial("localhost:27017")if err != nil {panic(err)}defer session.Close()session.SetMode(mgo.Monotonic, true)session.DB(databaseName).DropDatabase()c := session.DB(databaseName).C(tbl_person)d := session.DB(databaseName).C(tbl_log)tid := GenerateUUID()err = c.Insert(&Person{tid, "ssl", time.Now()})if err != nil {panic(err)}err = d.Insert(&Log{GenerateUUID(), "這是一個測試日誌", mgo.DBRef{tbl_person, tid, databaseName}, time.Now()})if err != nil {panic(err)}result := []Person{}err = c.Find(bson.M{}).All(&result)if err != nil {panic(err)}fmt.Println(result)result1 := []Log{}err = d.Find(bson.M{}).All(&result1)fmt.Println(result1)}// http://www.ashishbanerjee.com/home/go/go-generate-uuidfunc GenerateUUID() string {uuid := make([]byte, 16)n, err := rand.Read(uuid)if n != len(uuid) || err != nil {return ""}uuid[8] = 0x80 // variant bits see page 5uuid[4] = 0x40 // version 4 Pseudo Random, see page 7return hex.EncodeToString(uuid)}
上面用到了兩個集合,一個人員資訊,一個日誌資訊,主要測試是向日誌表插入人員資訊的引用.運行結果如下:
[ `run` | done: 2.279229602s ] [{0d5f77aa40146d128076f74fb0a8c926 ssl 2014-01-25 10:40:14.212 +0800 CST}] [{2d9250164069986580a760bca46d0e9b 這是一個測試日誌 {persons 0d5f77aa40146d128076f74fb0a8c926 myDB} 2014-01-25 10:40:16.241 +0800 CST}]
參考:
Database References
MongoDB之DBref(關聯插入,查詢,刪除) 執行個體深入
MongoDB聯集查詢
Go (#golang) and MongoDB using mgo
There is some example to use DbRef?