2013-03-16 3 views
1

Я использовал код ниже, чтобы сохранить запись JSON в MongoDB, но сохраняется только последняя запись «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, mw и index.

Обратите внимание, что mw и index повторяются через c1 и c2. Это означает, что когда вы вызываете insertEntry(c2), вы переписываете записи mw и index. Если вы распечатаете содержимое своей карты после каждого вызова до insertEntry, вы можете наблюдать за этим поведением.

Есть несколько вещей, которые вы могли бы сделать, чтобы избежать этого, в зависимости от ваших потребностей. Вы можете переформатировать свой json, чтобы избежать этих конфликтов, вы можете позвонить c.Insert один раз для каждой из ваших c переменных (со свежей картой для каждого), что приведет к созданию разных документов mongodb для каждого химического определения json вместо одного большого, содержащего и то и другое.

+0

Я попытался вызвать c.Insert один раз для каждой переменной c с этим [кодом] (https://github.com/mictadlo/mgo/blob/master/chemeo/chemeo.go), но теперь я получил следующие ошибки: "./chemeo.go:11: невозможно преобразовать запись (тип [] string), чтобы ввести [] байт ./chemeo.go:51: нельзя использовать химикаты (тип map [string] interface {}) как тип * map [string] interface {} в аргументе функции ". Как можно их исправить? – user977828

Смежные вопросы