需要 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。
