gpt4 book ai didi

mongodb - time.Duration 出乎意料地是 'divided' by 1'000' 000

转载 作者:数据小太阳 更新时间:2023-10-29 03:29:45 24 4
gpt4 key购买 nike

我正在使用 time.Duration 将数据存储在结构中,如下所示:

type ApiAccessToken struct {
...
ExpiredIn *time.Duration `bson:"expired_in,omitempty" json:"expired_in,omitempty"`
...
}

我使用这样的常量设置它:

...
const ApiAccessTokenDefaultExpiresIn = 7 * 24 * time.Hour
...
d := ApiAccessTokenDefaultExpiresIn
data := &ApiAccessToken{
...
ExpiredIn: &d
...
}
...

然后我使用 mgo 将数据插入数据库。

我在创建 data 实例之后和插入数据之前进行了检查,ExpiredIn 的值是 604'800'000'000'000 但在 MongoDB 中它变成了604'800'000(或 NumberLong(604800000))。

知道为什么吗?谢谢!

最佳答案

我们通常会为特定类型编写自定义 MarshalJSON/UnmarshalJSON,以控制在编码/解码之前/之后它们的值会发生什么。

type ExpiredIn struct {
time.Duration
}

func (e *ExpiredIn) MarshalJSON() ([]byte, error) {
return []byte(string(e.Nanoseconds())), nil
}

func (e *ExpiredIn) UnmarshalJSON(data []byte) error {
i, _ := strconv.ParseInt(string(data[:])), 10, 64)
e.Duration = time.Duration(i)
return nil

}

测试代码如下:

package main

import (
"log"
"time"

"gopkg.in/mgo.v2"
)

type Token struct {
ExpiredIn time.Duration
}

type ExpiredIn struct {
time.Duration
}

func (e *ExpiredIn) MarshalJSON() ([]byte, error) {
return []byte(string(e.Nanoseconds())), nil
}

func main() {
session, err := mgo.Dial("mongodb://localhost:27017/test")
if err != nil {
panic(err)
}
defer session.Close()

// Optional. Switch the session to a monotonic behavior.
session.SetMode(mgo.Monotonic, true)

c := session.DB("test").C("tokens")
err = c.Insert(&Recipe{7 * 24 * time.Hour})
if err != nil {
log.Fatal(err)
}
}

大功告成!

enter image description here

关于mongodb - time.Duration 出乎意料地是 'divided' by 1'000' 000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49955238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com