MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Problema di precisione temporale sul confronto nel driver mongodb in Go e possibilmente in altre lingue e altri database

I tempi in BSON sono rappresentati come millisecondi UTC dall'epoca Unix (spec ). I valori temporali in Go hanno una precisione di nanosecondi.

Per eseguire il round trip time.Time valori tramite il marshalling BSON, utilizzare tempi troncati a millisecondi dall'epoca Unix:

func truncate(t time.Time) time.Time {
    return time.Unix(0, t.UnixNano()/1e6*1e6)
}

...

u := user{
    Username:          "test_bson_username",
    Password:          "1234",
    UserAccessibility: "normal",
    RegisterationTime: truncate(time.Now()), 
}

Puoi anche utilizzare Time.Truncate metodo:

u := user{
    Username:          "test_bson_username",
    Password:          "1234",
    UserAccessibility: "normal",
    RegisterationTime:  time.Now().Truncate(time.Millisecond),
}

Questo approccio si basa sul fatto che l'epoca di Unix e il tempo di Go zero differiscono di un numero intero di millisecondi.