LoginSignup
3
3

More than 5 years have passed since last update.

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

Posted at

目的:

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3