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()函数的作用与使用方法的完整攻略,希望对你有帮组!