目的:
使用しているMongoDBからデータを引き出して、Modelにマッピングする
環境:
Mac 10.10.1
go version 1.3.1
revel
MongoDB
実装内容:
MongoDBからDataを引き出し終了した時点を想定する。つまりbsonデータが手元にある状態。このデータをJSON形式に変換します。次にJSON形式のDATAをModelにmappingします。mappingしたデータをRender引数で渡してhtmlのTableで表示するまでを実装します。
ソースコードと解説:
bsonデータが複数入っている配列を想定します。配列内の各要素をobjとして、objを引数にする関数を定義します。
jsonserializer.go
package controllers
import (
"AirNavigator/app/models"
"encoding/json"
)
type JSONSerializer struct {
err error
data []byte
}
func (c *JSONSerializer) encoding(entity interface{}) []byte {
var err error
var data []byte
data, err = json.Marshal(entity)
c.errHandler(err)
return data
}
func (c *JSONSerializer) MappingToShop(entity interface{}) *models.Shop {
var shop *models.Shop
c.err = json.Unmarshal(c.encoding(entity), &shop)
c.errHandler(c.err)
return shop
}
func (c *JSONSerializer) errHandler(err error) {
if err != nil {
panic(err)
}
}
ERRORハンドリング用と中間処理結果を保持するようにbufferとしてdataを持っています。encoding関数はbsonデータを引数として受け取りjson.MarshalでJSONデータに変換します。
次にMappingToShop関数はJSONデータをShopモデルにマッピングしていきます。この時json.Unmarshalを使います。Mappingするときに重要なのはShop Model自体にMapping用Tagをつけておくことです。私は以下のようにTagをつけました。
shop.go
type Shop struct {
Name string `bson:"name" json:"name"`
Terminal string `bson:"terminal" json:"terminal"`
Floor int `bson:"floor" json:"floor"`
Comment string `bson:"comment" json:"comment"`
Keyword string `bson:"keyword" json:"keyword"`
ImageURL string `bson:"imageurl" json:"imageurl"`
uuid string `bson:"uuid" json:"uuid"`
update string `bson:"update" json:"update"`
Keywords []string `bson:"keywords" json:"keywords"`
ImageURLs []string `bson:"imageurls" json:"imageurls"`
Airport *Airport
}
意地悪に、入れ子でかつ、配列を持つModelですがなんの問題もなくMappingすることができました。