美文网首页
golang操作mongo文档中的map结构

golang操作mongo文档中的map结构

作者: 彳亍口巴 | 来源:发表于2022-03-17 21:17 被阅读0次

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


可以看出map也有自己的列,我们可以通过set或者inc等指令去操作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
}

相关文章

网友评论

      本文标题:golang操作mongo文档中的map结构

      本文链接:https://www.haomeiwen.com/subject/zmdbdrtx.html