2014-05-11 16 views
8

Próbuję wstawić niektóre dane w MongoDB za pomocą Go.Wstawianie danych do MongoDB z mgo

Oto struktura danych:

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

To jest moja funkcja insert:

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

I wreszcie, to jak ja to nazywam:

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

Kłopot , Spodziewałem się, że moje znaczniki bson magicznie działają, ale nie działają. zamiast danych są zapisywane jako:

{ "_id": ObjectId ("53700d9cd83e146623e6bfb4"), "RESOURCE_ID": 7660708, "słowo": "foo" ...}

to zostaje zapisany jako:

{ "_id": ObjectId ("53700d9cd83e146623e6bfb4"), "id": "", "RESOURCEID": 7.660.708, "słowo": "Foo" ...}

Jak mogę to naprawić?

Odpowiedz

11

Zmiana wpisu do:

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

Składnia Struct Etykiety nie używa przecinków między tagami. Wierzę, że to powinno to naprawić.

+0

to jest złe. nie tylko musi być Id typu bson.ObjectId, ale tagi bson nie są konieczne, z wyjątkiem ResourceId, który nie jest automatycznie przekierowywany do "resource_id". Wielkie pola struct są małe przez mgo. Wymagana jest tylko nazwa pola małej litery json. –

+1

@dalu _id może być dowolnego typu. Edycja: No cóż, chyba że PO spodziewał się ObjectId, co nie jest całkowicie jasne z pytania. –

+0

@dalu jak powiedział Gustavo, _id nie musi być ObjectId, to jest domyślny, ale nie zawsze wymagany wybór. Ponadto nic nie jest nie tak. Osobiście uważam, że dołączenie tagu struct bson jest lepszą praktyką na dłuższą metę, nawet jeśli jest taka sama. Wyobraź sobie, że pojawi się przyszły program i zdecydujesz się zmienić zmienną "Słowo" na "Tytuł". Bez zdefiniowania tagu bson zmieniłoby to magazyn danych, nie zdając sobie z tego sprawy. Zachowanie tagu bson pomaga w utrzymaniu IMO linii, a co gorsza, sprawia, że ​​wpisujesz kilka znaków dla jasności. – TrevorSStone

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

Zamiast Count() i włożyć() można użyć UpsertId która właśnie to robi, jeśli identyfikator istnieje zapis otrzymuje jeśli nie to włożony.

Insert() z pustym ObjectId pozwala MongoDB obsługi przypisania Id.

Edytowanie: Niewłaściwe zapytanie o liczbę. Występuje tu również błąd. Powinien to być "resource_id", a nie "resourceid", ponieważ zadeklarowałeś, że pole pasma nazywa się "resource_id"

+0

Sposób działania 'insertEntry' może wydawać się sprzeczny z intuicją, ale ma sens w sposobie działania programu. –

+0

tak, poprawiono to. Myślałem, że sprawdzasz, czy istnieje identyfikator obiektu, a następnie wstaw nowy rekord. –

+1

wtf to jest poprawna odpowiedź. Id musi być bson.ObjectId –

Powiązane problemy