douliang1369
2014-05-11 23:59 阅读 80

使用mgo将数据插入MongoDB

I'm trying to insert some data in MongoDB using Go.

Here is the data struct:

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"`
}

This is my insert function:

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

And finally, this is how I call it:

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

The trouble is, I was expecting my bson tags to magically work, but they don't. Instead of data being saved as:

{ "_id" : ObjectId("53700d9cd83e146623e6bfb4"), "resource_id" : 7660708, "word" : "Foo" ...}

It gets saved as:

{ "_id" : ObjectId("53700d9cd83e146623e6bfb4"), "id" : "", "resourceid" : 7660708, "word" : "Foo"...}

How can I fix this?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    dsd30433 dsd30433 2014-05-12 02:40

    Change entry to:

    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"`
    }
    

    The syntax for Struct Tags does not use commas between tags. I believe this should fix it.

    点赞 评论 复制链接分享
  • dongzhao1930 dongzhao1930 2014-05-12 02:49
    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"`
    }
    

    Instead of Count() and Insert() you can use UpsertId which does just that, if an Id exists the record is replaced if not it's inserted.

    Insert() with an empty ObjectId lets MongoDB handle Id assignment.

    Edit: Misread your Count query. You also have an error in there. It should be "resource_id" not "resourceid" because you declared that the bson field is named "resource_id"

    点赞 评论 复制链接分享
  • duanliaouu965826 duanliaouu965826 2019-05-11 23:19

    Update your Entry struct as:

    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"`
    }
    

    This should work!

    点赞 评论 复制链接分享

相关推荐