1

以下のコードを使用して JSON エントリを MongoDB に保存しましたが、最後のエントリ「c2」だけが保存されます。私は何を間違えましたか?

package main

import (
    "encoding/json"
    "fmt"
    "labix.org/v2/mgo"
    "labix.org/v2/mgo/bson"
)

func insertEntry(j *map[string]interface{}, entry string) {
    err := json.Unmarshal([]byte(entry), &j)
    if err != nil {
        panic(err)
    }

}

func main() {
    c1 := `{
    "mw" : 42.0922,
    "ΔfH°gas" : {
      "value" : 372.38,
      "units" : "kJ/mol"
    },
    "S°gas" : {
      "value" : 216.81,
      "units" : "J/mol×K"
    },
    "index" : [
      {"name" : "mw", "value" : 42.0922},
      {"name" : "ΔfH°gas", "value" : 372.38},
      {"name" : "S°gas", "value" : 216.81}
    ]
    }`

    c2 := `{
    "name": "silicon",
    "mw": 32.1173,
    "index": [
      {
    "name": "mw",
    "value": 32.1173
      }
    ]
    }`

    m := make(map[string]interface{})

    insertEntry(&m, c1)
    insertEntry(&m, c2)
    chemical := m["ΔfH°gas"].(map[string]interface{})
    fmt.Println("value: ", chemical["value"].(float64))
    fmt.Println("units: ", chemical["units"].(string))

    session, err := mgo.Dial("localhost")

    if err != nil {
        panic(err)
    }
    defer session.Close()

    // Optional. Switch the session to a monotonic behavior.
    session.SetMode(mgo.Monotonic, true)

    c := session.DB("test").C("chemicals")
    err = c.Insert(&m)
    if err != nil {
        panic(err)
    }

    result := &m
    err = c.Find(bson.M{"name": "silicon"}).One(&m)
    if err != nil {
        panic(err)
    }

    fmt.Println(result)
    fmt.Println("mw:", m["mw"])

    fmt.Println("value: ", chemical["value"].(float64))
    fmt.Println("units: ", chemical["units"].(string))

}
4

1 に答える 1

0

問題は、マップの作成方法にあるようです。json.Unmarshall への呼び出しは、json 内のすべての「最上位」エントリを取得し、それらをマップ内のキーにしています。この場合、それらはmwΔfH°gasS°gasindexnamemwおよび になりindexます。

mwとがとindexにわたって繰り返されることに注意してください。つまり、 を呼び出すと、およびエントリが上書きされます。を呼び出すたびにマップの内容を印刷すると、この動作を確認できます。c1c2insertEntry(c2)mwindexinsertEntry

必要に応じて、これを回避するためにできることがいくつかあります。これらの競合を回避するために json を再フォーマットすることができc.Insertます。変数ごとに 1 回c(それぞれに新しいマップを使用して) 呼び出すことができます。これにより、両方を含む 1 つの大きなものではなく、json 化学定義ごとに異なる mongodb ドキュメントが作成されます。

于 2013-03-16T14:29:25.740 に答える