当前位置: 首页 > 工具软件 > Go-Mongo > 使用案例 >

golang使用mongo-driver操作——改(进阶)

夏侯彬郁
2023-12-01

改的基础知识在前面几篇都涉及了的,很容易举一反三,这篇是为了记录一些还没涉及的知识。

将字段设置为当前时间,可以在需要记录字段更新时间时使用该方法(如果字段不存在,则会创建字段),
他有两种形式,一种是我们常见的时间格式,另一种是时间戳。

func Currentdate(mongo *mongo.Database, ctx context.Context) {
	filter := bson.M{"$currentDate": bson.M{"update": true, "updateDate": bson.M{"$type": "date"}, "updateTimestamp": bson.M{"$type": "timestamp"}}}
	mongo.Collection("test").UpdateOne(ctx, bson.M{}, filter)
}

默认使用常见时间格式,结果如下:

    "update" : ISODate("2022-07-05T12:12:55.615+0000"),
    "updateDate" : ISODate("2022-07-05T12:12:55.615+0000"),
    "updateTimestamp" : Timestamp(1657023175, 1)

当然也可以指定时间,直接使用golang的时间去赋值就好了,但是,存到mongo中都是固定的时间格式,并不会按照我们指定的时间格式去存储。

	timeLayout := "2006-01-02 15:04:05"
	tempdate, _ := time.Parse(timeLayout, "2022-07-01 16:07:00")
	filter := bson.M{"$set": bson.M{"update": tempdate}}

也可以以指定时间戳的形式更新,时间戳是以秒为单位的,第二个参数就是表示同一秒内操作次数区别,可选,当然我感觉完全没必要用他这个,用golang的时间戳,以数字形式存储就好了。

	tempDate := primitive.Timestamp{T: uint32(time.Now().Unix()), I: 1}
	filter := bson.M{"$set": bson.M{"updateTimestamp": tempDate}}

给指定字段增加指定值,可以为负数,如果该字段不存在,则会以该值为初始值创建字段,$mul则是乘法:

filter := bson.M{"$inc": bson.M{"object.id": -2}}

min关键字用于使用更小的值去更新原有的值,可用于数字类型和日期类型,max关键字则反过来:

// 如果指定的值小于字段的当前值,则将字段的值更新为指定的值
filter := bson.M{"$min": bson.M{"object.id": -3}}
	// 也可以用与日期格式
	// timeLayout := "2006-01-02 15:04:05"
	// tempdate, _ := time.Parse(timeLayout, "2021-07-01 16:07:00")
	// filter := bson.M{"$min": bson.M{"date": tempdate}}

字段重命名,当字段不存在时,什么也不做:

filter := bson.M{"$rename": bson.M{"object.id": "object.id1", "date": "date1"}}

upsert为true时:在更新时,如果匹配不到符合条件的文档,则会创建新的文档。
而此时使用SetOnInsert配合,可以给新增的文档设置一些字段和值,如果匹配到文档则不会新增字段:

// 当set形式导致新增文档时,setOnInsert内的字段会被作为其中一个字段插入文档中
func SetOnInsert(mongo *mongo.Database, ctx context.Context) {
	findFilter := bson.M{"_id": -1}
	filter := bson.M{"$set": bson.M{"newObject": "新增文档"}, "$setOnInsert": bson.M{"text": "只有新增文档时才会新建该字段"}}
	upsert := true
	options := options.UpdateOptions{Upsert: &upsert}
	_, err := mongo.Collection("test").UpdateOne(ctx, findFilter, filter, &options)
	fmt.Println(err)
}

新增了如下文档:

{
    "_id" : NumberInt(-1),
    "newObject" : "新增文档",
    "text" : "只有新增文档时才会新建该字段"
}

删除指定字段:

filter := bson.M{"$unset": bson.M{"object.id1": "", "date1": ""}}
 类似资料: