gpt4 book ai didi

go - mgo 最后一个 JSON 条目

转载 作者:IT王子 更新时间:2023-10-29 02:24:43 27 4
gpt4 key购买 nike

我使用下面的代码在 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))

}

最佳答案

看起来问题出在您构建 map 的方式上。您对 json.Unmarshall 的调用正在获取您的 json 中的所有“顶级”条目,并将它们作为您 map 中的键。在这种情况下,这些将是 mwΔfH°gasS°gasindex名称mw索引

请注意,mwindexc1c2 中重复。这意味着当您调用 insertEntry(c2) 时,您将覆盖 mwindex 条目。如果您在每次调用 insertEntry 后打印出 map 的内容,您可以观察到这种行为。

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

关于go - mgo 最后一个 JSON 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15449954/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com