2013-03-16 22 views
1

我使用下面的代码来存储MongoDB中的JSON条目,但只存储最后一个条目“c2”。我做错了什么?mgo ony上一个JSON条目

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)) 

} 

回答

0

看起来问题在于你构建地图的方式。你对json.Unmarshall的调用将把你的json中的所有“顶级”条目都放在你的地图上。在这种情况下,那些将是mw,ΔfH°gas,S°gas,index,name,mwindex

请注意,mwindexc1c2之间重复。这意味着当您拨打insertEntry(c2)时,您将覆盖mwindex条目。如果您在每次致电insertEntry后都打印出地图的内容,则可以观察到此行为。

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

+0

我试着调用c。用这个[代码](https://github.com/mictadlo/mgo/blob/master/chemeo/chemeo.go)为每个c变量插入一次,但现在我得到了以下错误:“./chemeo.go:11:不能转换条目(键入[]字符串)键入[]字节 ./chemeo.go:51:不能使用化学物质(键入map [string] interface {})作为类型* map [string] interface {} in function argument“。如何解决它们? – user977828 2013-03-17 01:37:08