यदि आप किसी मान को बदलना चाहते हैं या अपने मानों को / से मोंगोडीबी में मार्शलिंग/अनमर्शलिंग करते समय एक प्रकार का रूपांतरण करना चाहते हैं, तो आप कस्टम मार्शलिंग/अनमर्शलिंग तर्क को लागू करके ऐसा कर सकते हैं।
आप 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
कीवर्ड एक नया प्रकार बनाता है, और यह अंतर्निहित प्रकार के तरीकों को "विरासत" नहीं करता है)।
संबंधित / समान प्रश्न भी देखें:समय के साथ दस्तावेज़ सम्मिलित करते समय डिफ़ॉल्ट तिथि निर्धारित करें। समय क्षेत्र