MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Zeitgenauigkeitsproblem beim Vergleich im Mongodb-Treiber in Go und möglicherweise in anderen Sprachen und anderen Datenbanken

Zeiten in BSON werden als UTC-Millisekunden seit der Unix-Epoche (spec ) dargestellt ). Zeitwerte in Go haben eine Genauigkeit von Nanosekunden.

Um time.Time-Werte durch BSON-Marshalling zu runden, verwenden Sie seit der Unix-Epoche auf Millisekunden verkürzte Zeiten:

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

Sie können auch Time.Truncate verwenden Methode:

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

Dieser Ansatz beruht auf der Tatsache, dass sich die Unix-Epoche und die Go-Zero-Zeit um eine ganze Zahl von Millisekunden unterscheiden.