mgoにおけるDBRef-データ追加試験

3648 ワード

2014-1-25
mongoデータベースを設計する際に、ログ情報テーブルは人員情報テーブルのデータを参照する必要があるという問題がある.構造化データベースであれば、基本的にあまり考えなくてもいいです.構造化されていないデータベースに接触したばかりなので、本の理解ではログの数が多いため、埋め込みデータを採用すると可変要素が多すぎます(これが合理的かどうか分かりませんが、例えば、人員が各部門でジャンプするとデータが常に変更されます^^!)、したがって、参照データ方式を用いる必要がある.今日はまずデータを挿入するテストDEMOを書いて、時間があってからクエリーを補充します.
package main

import (
	"crypto/rand"
	"encoding/hex"
	"fmt"
	"labix.org/v2/mgo"
	"labix.org/v2/mgo/bson"
	"time"
)

var (
	mgoSession   *mgo.Session
	databaseName = "myDB"
	tbl_person   = "persons"
	tbl_log      = "logs"
)

type Person struct {
	Id       string
	Name     string
	Inserted time.Time
}

type Log struct {
	LogId    string
	Log      string
	LogUser  mgo.DBRef
	Inserted 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-uuid
func 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 5
	uuid[4] = 0x40 // version 4 Pseudo Random, see page 7

	return hex.EncodeToString(uuid)
}

上には2つの集合、1つの人員情報、1つのログ情報が用いられ、主なテストはログテーブルに人員情報の参照を挿入することである.実行結果は次のとおりです.
[ `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(相关插入、クリー、删除)Instance的深さ

  • MongoDB联合库埃利

  • Go (#golang) and MongoDB using mgo

  • There is some example to use DbRef?