GoLang 中用 MongoDB Watch 监听指定字段的变化
需要 MongoDB 3.6 及以上, 需要 ReplicaSet 模式。
监听一个字段的变化:
例如监听字段 name
:
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))
}
监听两个字段的变化:
例如监听字段 name
和 age
:
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
。
坑:如果使用 Robo 3T 进行修改,operationType是 replace。
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆