MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Достъп до MongoDB от Go

Ако искате да промените стойност или да направите преобразуване на тип при маршалиране / демаршалиране на вашите стойности от / към MongoDB, можете да го направите, като внедрите персонализирана логика за маршалиране / демаршалиране.

Можете да направите това, като внедрите bson.Getter и bson.Setter интерфейси. Вътре в тези методи можете да правите каквото искате със стойностите, които се маршалират/демаршалират.

Най-лесно е да разширите вашите clientConfigData въведете с допълнително поле, което ще бъде от тип time.Time , стойността, от която се нуждаете:

type clientConfigData struct {
    SMTPAssoc  int       `bson:"smtp_assoc"`
    PlanType   string    `bson:"plan_type"`
    EndDateStr string    `bson:"end_date"`
    EndDate    time.Time `bson:"-"`
}

Той има стойност на маркера bson:"-" , защото не искаме това да се показва в MongoDB.

И сега персонализираната логика за маршалиране / демаршалиране:

const endDateLayout = "2006-01-02 15:04:05" // Use your layout here

func (c *clientConfigData) SetBSON(raw bson.Raw) (err error) {
    type my clientConfigData
    if err = raw.Unmarshal((*my)(c)); err != nil {
        return
    }
    c.EndDate, err = time.Parse(endDateLayout, c.EndDateStr)
    return
}

func (c *clientConfigData) GetBSON() (interface{}, error) {
    c.EndDateStr = c.EndDate.Format(endDateLayout)
    type my *clientConfigData
    return my(c), nil
}

Това, което се случва тук, е, че SetBSON() е отговорен да "попълни" стойността на вашата структура с необработената стойност, идваща от MongoDB и GetBSON() е отговорен да предостави стойност, която искате да бъде запазена (маршалирана).

При зареждане:SetBSON() първо демаршали стойността такава, каквато е, след това правилно задава EndDate поле (което е от тип time.Time ) от string стойност за дата, която дойде от DB (EndDateStr ).

При записване:GetBSON() първо попълва EndDateStr полето (това, което е запазено) от EndDate поле и след това просто се връща, като сигнализира, че е добре да се запази.

Едно нещо, което трябва да се отбележи:и двете SetBSON() и GetBSON() създайте нов my напишете вътре в тях. Причината за това е да се избегне препълването на стека. Просто връщане на стойност от тип clientConfigData е лошо, защото внедрихме bson.Getter и bson.Setter , така че SetBSON() и GetBSON() ще ви се обаждат безкрайно. Новият my type няма тези методи, така че безкрайната "рекурсия" не се случва (type ключова дума създава нов тип и не "наследява" методи на основния тип).

Вижте също свързан / подобен въпрос:Задаване на дата по подразбиране при вмъкване на документ с полето time.Time




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Създадени от MongoDB файлове

  2. Импортирайте CSV данни като масив в MongoDB с помощта на mongoimport

  3. Мониторинг на база данни без агент с ClusterControl

  4. mongodb получава _id като низ в заявката за намиране

  5. MongoDB карта()