MongoDBから読み出したDataをModelにマッピングする方法

More than 3 years have passed since last update.


目的:

 使用している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することができました。