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、 "Word": "Foo" ...}
次のように保存されます:
{"_id":ObjectId( "53700d9cd83e146623e6bfb4")、 "id": ""、 "resourceid":7660708、 "Word": "Foo" ...}
どうすればこれを修正できますか?
エントリを次のように変更します。
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タグの構文では、タグ間にコンマを使用しません。私はこれがそれを修正するはずだと信じています。
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"`
}
Count()とInsert()の代わりに、UpsertIdを使用できます。これは、IDが存在する場合、レコードが挿入されていない場合は置き換えられます。
空のObjectIdを持つInsert()により、MongoDBはIDの割り当てを処理できます。
編集:カウントクエリを読み間違えました。そこにもエラーがあります。 bsonフィールドの名前が「resource_id」であると宣言したため、「resourceid」ではなく「resource_id」にする必要があります。
エントリ構造体を次のように更新します。
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"`
}
これはうまくいくはずです!