mongodb - 更新 MongoDB 和 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 秒,而不是纳秒。
推荐阅读
- mysql - 从两个连接的聚合查询计算
- oracle-apex - Oracle APEX 18 - 经典报告错误缓冲区小
- azure - Azure CosmosDb 中的动态属性/透视行为
- docker - 无法访问内部网络中 vm 上运行的容器 url
- c# - 如何更改将在任务栏上显示的图标
- java - 即使在 setText 之后芯片文本也是空的
- c# - 将行为添加到相互调用的重写重载
- apache-flink - 生成“心跳”类型的事件来推动事件时间
- r - 如何将 stat_poly_eq 标签放在构面图之外?
- python - ImportError:无法从“importlib”导入名称“元数据”