GoLang 中用 MongoDB Watch 监听指定字段的变化

需要 MongoDB 3.6 及以上, 需要 ReplicaSet 模式。
监听一个字段的变化:

func watch(coll *mongo.Collection) {
    match := bson.D{{"operationType", "update"},
        {"updateDescription.updatedFields.name", bson.D{{"$exists", true}}}}
    coll.Watch(context.Background(), mongo.Pipeline{{{"$match", match}}},
        options.ChangeStream().SetFullDocument(options.UpdateLookup))
}

监听两个字段的变化:

func watch(coll *mongo.Collection) {
    match := bson.D{
                {"operationType", "update"},
        {"$or", bson.A{
            bson.D{{"updateDescription.updatedFields.name", 
                                bson.D{{"$exists", true}},
                        }},
            bson.D{{"updateDescription.updatedFields.age", 
                                bson.D{{"$exists", true}},
                        }},
                }}

    coll.Watch(context.Background(), mongo.Pipeline{{{"$match", match}}},
        options.ChangeStream().SetFullDocument(options.UpdateLookup))
}

任意一个变化,用$or ,都变化,用$and。注意 bson.A 里面是 bson.D

转载于:https://www.cnblogs.com/flipped/p/mongo-watch-specified-fields.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Go语言中监听MongoDB数据库变化,可以使用MongoDB官方提供的驱动程序来实现。 具体步骤如下: 1. 使用go get 命令安装mongo-go-driver,这是MongoDB官方提供的Go语言驱动程序。 2. 在代码中导入该包。 3. 连接到MongoDB数据库。 4. 使用Collection.Watch()函数监听数据库的变化。 5. 在回调函数中处理变化事件。 以下是一个简单的示例代码: ``` package main import ( "context" "log" "time" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { // 连接到MongoDB client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017")) if err != nil { log.Fatal(err) } // 监听 test 集合中的变化 coll := client.Database("mydb").Collection("test") ctx, _ := context.WithTimeout(context.Background(), 5*time.Second) cursor, err := coll.Watch(ctx, mongo.Pipeline{}) if err != nil { log.Fatal(err) } defer cursor.Close(ctx) for cursor.Next(ctx) { var doc bson.M if err := cursor.Decode(&doc); err != nil { log.Fatal(err) } log.Println(doc) } if err := cursor.Err(); err != nil { log.Fatal(err) } } ``` 请注意,仅在MongoDB 4.0及更高版本中支持监听数据库变化,如果您正在使用较低版本的MongoDB,则可能需要更新您的数据库或使用第三方库来实现相同的功能。 ### 回答2: Go语言可以使用MongoDB的Change Stream API来监听MongoDB数据库的变化。以下是一个简单的示例: 首先,我们需要使用Go语言的MongoDB驱动程序来连接到MongoDB数据库: ``` import ( "context" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { // 设置MongoDB连接选项 clientOptions := options.Client().ApplyURI("mongodb://localhost:27017") // 连接到MongoDB client, err := mongo.Connect(context.TODO(), clientOptions) if err != nil { log.Fatal(err) } // 检查连接是否成功 err = client.Ping(context.TODO(), nil) if err != nil { log.Fatal(err) } // 连接成功! fmt.Println("Connected to MongoDB") // 在这里添加监听逻辑... } ``` 一旦成功连接到MongoDB,我们可以创建一个Change Stream来监听数据库中的变化。以下是一个示例: ``` func main() { // ... // 订阅Change Stream pipeline := mongo.Pipeline{} changeStream, err := client.Database("mydb").Collection("mycollection").Watch(context.TODO(), pipeline) if err != nil { log.Fatal(err) } // 循环读取Change Stream中的事件 for changeStream.Next(context.TODO()) { var event struct { OperationType string `bson:"operationType"` FullDocument bson.RawValue `bson:"fullDocument"` } // 解码事件 err := changeStream.Decode(&event) if err != nil { log.Fatal(err) } // 处理事件 fmt.Printf("Operation Type: %s, Full Document: %s\n", event.OperationType, string(event.FullDocument.Raw)) } // 关闭Change Stream changeStream.Close(context.TODO()) // ... } ``` 您可以根据需要自定义Change Stream的pipeline来过滤您感兴趣的事件。注意,在上面的示例中,我们只是简单地打印出了收到的事件的操作类型和完整文档的内容。 以上就是使用Go语言监听MongoDB数据库变化的基本步骤和示例。希望对您有所帮助! ### 回答3: 要使用Golang监听MongoDB数据库的变化,可以通过MongoDB的Change Streams功能来实现。 首先,需要使用Go的MongoDB驱动程序来连接MongoDB数据库。可以选择使用官方的mongodb/mongo-go-driver,或者第三方的go.mongodb.org/mongo-driver。 接下来,需要使用Change Streams功能来监听数据库的变化。可以通过使用ChangeStream方法,传入一个或多个监视的collection和一个或多个选项来创建一个ChangeStream实例。 在ChangeStream实例中,可以使用游标的Next方法来监听并获取数据库的变化。每当有变化发生时,Next方法将返回相应的文档。可以根据需要处理这些文档,例如打印出变化的内容。 以下是一个简单的示例代码: ```go package main import ( "context" "fmt" "log" "time" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { // 连接MongoDB数据库 client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017")) if err != nil { log.Fatal(err) } ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() err = client.Connect(ctx) if err != nil { log.Fatal(err) } // 选择要监听的数据库和集合 db := client.Database("mydb") collection := db.Collection("mycollection") // 创建ChangeStream实例 pipeline := []bson.M{{"$match": bson.M{"operationType": "insert"}}} // 监听插入操作 options := options.ChangeStream().SetFullDocument(options.UpdateLookup) changeStream, err := collection.Watch(ctx, pipeline, options) if err != nil { log.Fatal(err) } // 监听数据库变化 for changeStream.Next(ctx) { var document bson.M err := changeStream.Decode(&document) if err != nil { log.Fatal(err) } fmt.Println(document) } if err := changeStream.Err(); err != nil { log.Fatal(err) } } ``` 上述代码是一个简单的示例,可以监听指定数据库和集合的插入操作,并打印出插入的文档。具体的监听逻辑,如监听更新或删除操作,以及处理变化的方式,可以根据实际需要进行调整。 请注意,使用Change Streams功能需要MongoDB版本3.6或更高版本,并且需要正确安装和配置MongoDB服务器。另外,在处理ChangeStream实例时,需要注意错误的处理和资源的释放,以保证程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值