在做insert操作的时候,我们的结构体可能含有map,插入到数据库中就如下所示:

可以看出map也有自己的列,我们可以通过
代码如下所示;
package main
import (
"context"
"fmt"
"github.com/juju/errors"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"smallzhoutest/mongoDBtest/util"
"strings"
"time"
)
type FansRank struct {
Uin int64
SingerID int64
TotalCardiacValue int32 // 累计获得的心动值
TodayCardiacValue int32 // 今天获得的心动值
Today string
TaskMap map[string]struct{} // 存储当天任务的完成情况
}
var (
client *mongo.Client
db *mongo.Database
collection *mongo.Collection
)
func init() {
// 创建连接
client = util.GetMgoCli()
//2.选择数据库 my_db
db = client.Database("detal")
//3.选择表 my_collection
collection = db.Collection("task2")
}
func main() {
//insertValue()
fmt.Println(SetCardiacValue(111, 222, "2022-03-18_1", 20))
//deleteMap()
}
func deleteMap() {
filter := bson.M{"uin": 111, "singerid": 222}
update := bson.M{}
delM := bson.M{"taskmap.2022-03-17_5": struct{}{}}
delM["taskmap.2022-03-17_3"] = struct{}{}
update["$unset"] = delM
res, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(res.ModifiedCount)
}
// insertValue 插入一个文档
func insertValue() {
rank := FansRank{
Uin: 111,
SingerID: 222,
TotalCardiacValue: 100,
TodayCardiacValue: 100,
Today: time.Now().Format("2006-01-02"),
TaskMap: map[string]struct{}{
"2022-03-17_1": {},
},
}
res, err := collection.InsertOne(context.TODO(), rank)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(res.InsertedID)
}
// SetCardiacValue
func SetCardiacValue(uin, singerID int64, taskID string, cardiacValue int32) error {
filter := bson.M{"uin": uin, "singerid": singerID}
var fansRank FansRank
err := collection.FindOne(context.TODO(), filter).Decode(&fansRank)
// 若数据不存在也是错误
if err != nil {
return errors.Annotate(err, "Decode failed!")
}
if _, ok := fansRank.TaskMap[taskID]; ok {
fmt.Println("任务已存在")
return nil
}
filter = bson.M{"uin": uin, "singerid": singerID, "totalcardiacvalue": fansRank.TotalCardiacValue}
update := bson.M{}
setM := bson.M{}
incM := bson.M{}
delM := bson.M{}
today := "2020-03-18"
if fansRank.Today != today {
// 今天首次
setM["today"] = today
setM["todaycardiacvalue"] = cardiacValue
for key := range fansRank.TaskMap {
if !strings.HasSuffix(key, today) {
// 不是今天的任务就要删除掉
delM["taskmap."+key] = struct{}{}
}
}
} else {
// 不是今天首次
incM["todaycardiacvalue"] = cardiacValue
}
setM[fmt.Sprintf("%s.%s", "taskmap", taskID)] = struct{}{}
incM["totalcardiacvalue"] = cardiacValue
//
update["$set"] = setM
update["$inc"] = incM
if len(delM) > 0 {
update["$unset"] = delM
}
result, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
fmt.Println(err)
return err
}
fmt.Println(result.ModifiedCount)
return nil
}
网友评论