注册

详解MongoDB的watch()函数:监听集合中的变化

MongoDB的watch()函数可以用于监测一个集合(collection)的变化,当有文档(document)被插入,更新或删除时,它会产生一个通知,并返回一个Change Stream。这个Change Stream允许开发者在实时应用和数据流应用中实时获取集合的变更数据。

watch()函数的用法如下:

db.collection('collection_name').watch(pipeline, options)

其中,pipeline参数表示变更管道,可以过滤或者特殊处理要返回的结果。options参数是一个可选的对象,可以定义一些watch()函数的选项,比如设置单位时间内最大返回数量的条目数,或者设置在哪些服务器上运行等等。

下面以两个实例来具体讲解watch()函数的用法:

实例一:监测单个集合的变化

假设我们有一个电子商务网站,我们希望收集商品评论,并在评论被修改或新评论被添加时实时更新我们的展示。

我们可以在MongoDB的JavaScript Shell中打开监听器,如下所示:

db.comments.watch(
   [
      {$match: {"fullDocument.productId": 1}},
      {$project: {"_id": 0, "fullDocument": 1}}
   ]
)

这里我们设定接收productId为1的商品评论更新,我们将使用$match过滤和管道过程以便处理fullDocument返回。

当一个评论被添加到MongoDB中时,我们可以看到以下输出:

{ "_id" : { "_data" : "825F2D7E40000000....", "operationTime" : Timestamp(1462187413, 2) }, "fullDocument" : { "productId" : 1, "user" : "Tom", "comment" : "good" } }

实例二:在多个服务器上运行watch()函数

假设我们在多个服务器上运行MongoDB,那么我们可以使用options参数来指定在哪些服务器上运行。

下面是一个在三个服务器上运行watch()函数的例子:

db.collection('collection_name').watch([], {
  maxAwaitTimeMS: 1000,
  batchSize: 10,
  startAtOperationTime: new Timestamp(1474980106, 1),
  readPreference: { mode: 'primaryPreferred', tags: [ { dc: 'east' } ] }
})

这里,我们使用了一个空的pipeline和maxAwaitTimeMS参数来指定在一秒内返回的最大结果数为10并设置在集合上的最新时间戳为new Timestamp(1474980106, 1)。

我们还通过readPreference选项将集合操作分配给特定数据中心(数据中心标签为“东部”)中的一个主节点。

这样,当任何服务器上的集合被更新,我们都会收到变更的通知。

这就是watch()函数的作用与使用方法的完整攻略,希望对你有帮组!