1

我使用下面的代码在 MongoDB 中存储 JSON 条目,但只存储最后一个条目“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°gas, S°gas, index, name, mw, 和index

请注意mw和在和index中重复。这意味着当您调用 时,您将覆盖and条目。如果您在每次调用后打印出地图的内容,您可以观察到这种行为。c1c2insertEntry(c2)mwindexinsertEntry

根据您的需要,您可以采取一些措施来避免这种情况。您可以重新格式化您的 json 以避免这些冲突,您可以c.Insert为每个变量调用一次(每个c变量都有一个新的映射),这将导致为每个 json 化学定义创建不同的 mongodb 文档,而不是一个包含两者的大文档。

于 2013-03-16T14:29:25.740 回答