Вставка данных в MongoDB с помощью mgo

Я пытаюсь вставить некоторые данные в MongoDB с помощью Go.

Вот структура данных:

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

Как я могу это исправить?

Ответ 1

Измените запись на:

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 не использует запятые между тегами. Я считаю, что это должно исправить это.

Ответ 2

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, позволяет MongoDB обрабатывать идентификатор Id.

Изменить: Неверный запрос вашего графа. У вас также есть ошибка. Он должен быть "resource_id" не "resourceid", потому что вы заявили, что поле bson называется "resource_id"

Ответ 3

Обновите вашу структуру 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"'
}

Это должно работать!