学习Golang要努力,但是不要急!今天的这篇文章《更新 MongoDB 和 Golang 驱动程序中的时间戳字段》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!
问题内容我正在使用 golang 的官方 mongodb 驱动程序。我有一个时间戳类型的字段,我想从我的 golang 代码中更新它。
这是我的结构(lastupdate 字段是时间戳字段):
import (
"context"
"log"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type mystruct struct {
id primitive.objectid `json:"id" bson:"_id,omitempty"`
name string `json:"name"`
alias string `json:"alias"`
signed bool `json:"signed"`
age int `json:"age"`
createddate time.time `json:"createddaate"`
lastupdate primitive.timestamp `json:"lastupdate"`
}
然后我传递这个 bson 来更新我的数据:
// logic to update data
docID, _ := primitive.ObjectIDFromHex("5de30185e4fabe4778f0ffdf")
UpdateMyData(c, bson.M{"createdDate": time.Now(), "lastUpdate": time.Now().UnixNano() }, bson.M{"_id": docID})
//update method
func UpdateMyData(client *mongo.Client, updatedData bson.M, filter bson.M) int64 {
collection := client.Database("*****").Collection("*****")
atualizacao := bson.D{ {Key: "$set", Value: updatedData} }
updatedResult, err := collection.UpdateOne(context.TODO(), filter, atualizacao)
if err != nil {
log.Fatal("Error on updating one Hero", err)
}
return updatedResult.ModifiedCount
}
updatemydata 方法的内容很好,因为它只接受 bson 并调用 updateone 方法将数据更新到数据库中,并且适用于我正确拥有的所有不同字段。
问题是time.now().unixnane()返回int64值,上面的代码不会抛出错误,但它改变了我的 mongodb 数据库中该特定行的 lastupdated 为 int64!那么将数据传递到时间戳字段而不改变其类型的正确方法是什么?
解决方案
尝试传递时间戳而不是 int64:
"lastUpdate": primitive.Timestamp{T:uint32(time.Now().Unix())}
请注意,mongodb 时间戳是 unix 秒,而不是纳秒。
今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注编程网公众号,一起学习编程~