登录
首页 >  Golang >  Go问答

监听MongoDB文档更新的id-based管道处理

来源:stackoverflow

时间:2024-02-17 17:09:16 367浏览 收藏

哈喽!今天心血来潮给大家带来了《监听MongoDB文档更新的id-based管道处理》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

我正在尝试创建一个函数来监视数据库中某个具有特定 id 的文档以进行更新,但它不起作用。它只是在更新文档时保持活动状态,而函数应该返回。我已经尝试了多种方法,其余代码工作正常。当我删除 id 部分并侦听该集合中的所有文档更新时,该函数将按其应有的方式执行

func iterateChangeStream(routineCtx context.Context,stream *mongo.ChangeStream, chn chan string) {
    defer stream.Close(routineCtx)

    for stream.Next(routineCtx) {
        var data bson.M
        if err := stream.Decode(&data); err != nil {
            fmt.Println(err)
        }
        chn <- "updated"
        err := stream.Close(routineCtx)
        if err != nil {
            return
        }
        return
    }
    return
}

func (s Storage) ListenForScannerUpdateById(id primitive.ObjectID) {
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
    defer cancel()
    chn := make(chan string)


    coll := s.db.Collection("scanners")

    scan, err := s.GetScannerById(id)
    fmt.Println(scan)

    matchPipeline := bson.D{
        {
            "$match", bson.D{
                {"operationType", "update"},
                {"fullDocument._id", bson.D{
                    {"$eq", id},
                }},
            },
        },
    }

    scannerStream, err := coll.Watch(ctx, mongo.Pipeline{matchPipeline})
    if err != nil {
        err := scannerStream.Close(ctx)
        if err != nil {
            panic( err)
        }
        fmt.Printf("err: %v", err)
    }

    routineCtx, _ := context.WithCancel(context.Background())

    go iterateChangeStream(routineCtx, scannerStream, chn)
    msg, _ := <- chn
    defer close(chn)
    fmt.Println(msg)
    return
}

正确答案


好吧,在第二次阅读文档后我发现了这个:

因此,在像这样将 fulldocument 选项设置为 updatelookup 后,效果完美:

scannerStream, err := coll.Watch(ctx, mongo.Pipeline{matchPipeline}, options.ChangeStream().SetFullDocument(options.UpdateLookup))

理论要掌握,实操不能落!以上关于《监听MongoDB文档更新的id-based管道处理》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>