我正在尝试使用Go在MongoDB中插入一些数据。
这是数据结构:
type Entry struct {
Id string `json:"id",bson:"_id,omitempty"`
ResourceId int `json:"resource_id,bson:"resource_id"`
Word string `json:"word",bson:"word"`
Meaning string `json:"meaning",bson:"meaning"`
Example string `json:"example",bson:"example"`
}
这是我的插入功能:
func insertEntry(db *mgo.Session, entry *Entry) error {
c := db.DB(*mongoDB).C("entries")
count, err := c.Find(bson.M{"resourceid": entry.ResourceId}).Limit(1).Count()
if err != nil {
return err
}
if count > 0 {
return fmt.Errorf("resource %s already exists", entry.ResourceId)
}
return c.Insert(entry)
}
最后,这就是我所说的:
entry := &Entry{
ResourceId: resourceId,
Word: word,
Meaning: meaning,
Example: example,
}
err = insertEntry(db, entry)
if err != nil {
log.Println("Could not save the entry to MongoDB:", err)
}
麻烦的是,我期待我的bson
标签神奇地工作,但他们没有。
而不是将数据保存为:
{“_ id”:ObjectId(“53700d9cd83e146623e6bfb4”),“resource_id”: 7660708,“字”:“Foo”......}
它保存为:
{“_ id”:ObjectId(“53700d9cd83e146623e6bfb4”),“id”:“”, “resourceid”:7660708,“word”:“Foo”......}
我该如何解决这个问题?
答案 0 :(得分:14)
将条目更改为:
type Entry struct {
Id string `json:"id" bson:"_id,omitempty"`
ResourceId int `json:"resource_id" bson:"resource_id"`
Word string `json:"word" bson:"word"`
Meaning string `json:"meaning" bson:"meaning"`
Example string `json:"example" bson:"example"`
}
Struct Tags的语法不在标记之间使用逗号。我相信这应该解决它。
答案 1 :(得分:8)
type Entry struct {
Id bson.ObjectId `bson:"_id,omitempty" json:"id"`
ResourceId int `json:"resource_id" bson:"resource_id"`
Word string `json:"word"`
Meaning string `json:"meaning"`
Example string `json:"example"`
}
您可以使用UpsertId而不是Count()和Insert()来实现这一点,如果存在Id,则替换该记录(如果没有插入)。
带有空ObjectId的Insert()允许MongoDB处理Id赋值。
编辑: 误读您的计数查询。 你也有错误。 它应该是“resource_id”而不是“resourceid”,因为您声明bson字段名为“resource_id”
答案 2 :(得分:0)
将您的Entry结构更新为:
type Entry struct {
Id string `bson:"_id"`
ResourceId int `json:"resource_id,omitempty"`
Word string `json:"word,omitempty"`
Meaning string `json:"meaning,omitempty"`
Example string `json:"example,omitempty"`
}
这应该有效!