我有一个简单的CRUDbook
应用程序,golang
、mongo-go-driver
Want:将每个CRUD操作记录到一个集合中。
例如:
- 创建一本书
- 将书插入
book
收藏 - 使用
bookId
、timestamp
将book.created
事件插入到history
集合中。。等等
问题:
- 想知道实现此功能的推荐方法是什么
mongo-go-driver
中是否有hook
功能?(钩子将在集合上的更新事件时触发。等(
我不熟悉Go本身,但通用的mongo(客户端(方法是命令监视,我认为Go驱动程序也支持它。你可以在这里和这里读到一些关于它的东西。您需要的事件是CommandSucceededEvent
目前不支持这一点,如果仔细想想,插入和更新可能不会发生在驱动程序级别,而是发生在数据库本身(例如,聚合结果可能"转储"到集合中(。
相反,您可以查看MongoDB数据库本身支持的更改流。你可以";订阅";以更改事件,并且当发生更改操作时,您将收到通知。
这与所要求的不完全相同,因为更改的来源(或原因(可能不是来自您的应用程序,因此这可能对您有利,也可能不是。
您可以使用Collection.Watch()
方法订阅集合的更改。以下是文档中的一个示例,说明如何订阅并获得";插入";操作:
var collection *mongo.Collection
// Specify a pipeline that will only match "insert" events.
// Specify the MaxAwaitTimeOption to have each attempt wait two seconds for
// new documents.
matchStage := bson.D{{"$match", bson.D{{"operationType", "insert"}}}}
opts := options.ChangeStream().SetMaxAwaitTime(2 * time.Second)
changeStream, err := collection.Watch(
context.TODO(),
mongo.Pipeline{matchStage},
opts)
if err != nil {
log.Fatal(err)
}
// Print out all change stream events in the order they're received.
// See the mongo.ChangeStream documentation for more examples of using
// change streams.
for changeStream.Next(context.TODO()) {
fmt.Println(changeStream.Current)
}
您可以从MongoDB文档中订阅的支持操作列表:
insert
delete
replace
update
drop
rename
dropDatabase
invalidate