关于mongo go驱动程序的crud日志的问题



我有一个简单的CRUDbook应用程序,golangmongo-go-driver

Want:将每个CRUD操作记录到一个集合中。

例如:

  1. 创建一本书
  2. 将书插入book收藏
  3. 使用bookIdtimestampbook.created事件插入到history集合中。。等等

问题:

  1. 想知道实现此功能的推荐方法是什么
  2. 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

最新更新