真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

【五分鐘了解MongoDB】ChangeStream和MongoDB4.x

充分獲知數(shù)據(jù)庫的數(shù)據(jù)變動是從MongoDB向其他數(shù)據(jù)服務(wù)進(jìn)行數(shù)據(jù)同步的關(guān)鍵點(diǎn)。與直接查詢collection來獲取數(shù)據(jù)變動相比,通過流式的方式進(jìn)行監(jiān)聽會有效并及時的多。這是一種非常強(qiáng)大的“響應(yīng)式編程”模式。隨著MongoDB的版本更新,流式的獲取方式將變得原來越易用。

創(chuàng)新互聯(lián)的客戶來自各行各業(yè),為了共同目標(biāo),我們在工作上密切配合,從創(chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對我們的要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。專業(yè)領(lǐng)域包括成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)、電商網(wǎng)站開發(fā)、微信營銷、系統(tǒng)平臺開發(fā)。

讓我們來一同回顧一下。在MongoDB3.6之前,如果我們希望對MongoDB數(shù)據(jù)庫中的數(shù)據(jù)變動進(jìn)行監(jiān)聽,我們通常是通過 “監(jiān)聽并回放oplog”(“tail the oplog”)的模式(oplog表將會記錄復(fù)制集中的數(shù)據(jù)變動)。在生產(chǎn)環(huán)境中這種方式(“監(jiān)聽并回放oplog”)通常較為復(fù)雜,并且難以保證其穩(wěn)定與可靠性。

Change Streams and Collections

從MongoDB3.6開始支持的 Change Streams打破了這個僵局。 Change Streams使得數(shù)據(jù)的變動監(jiān)聽變得簡單易用。以下是一個示例,該示例演示了通過Node.js對“movieDetails”表的變動監(jiān)聽。

javascript
const MongoClient = require("mongodb").MongoClient;
const uri = "MONGODBURL";
const client = new MongoClient(uri, { useNewUrlParser: true });
client.connect().then(db => {
 const changeStream = client.db("video").collection("movieDetails").watch();
 changeStream.on("change", next => {
   console.log(next);
 });
});

上述代碼首先連接進(jìn)入了數(shù)據(jù)實(shí)例,并通過watch()函數(shù)對“video”庫的“movieDetails”表建立了change stream。而后通過.on(“change”,… 建立了一個事件trigger,該事件將監(jiān)聽該change stream上的所有變動并調(diào)用對應(yīng)的后續(xù)函數(shù)。在上述示例中,監(jiān)聽到變動后將會將變動事件打印出來。下面是我們在  MongoDB Compass中進(jìn)行對應(yīng)修改后的輸出示例:

javascript
{ _id:   
   { _data:      '825C51D03F0000000129295A1004E515B4338C574BA2B9603CB1C7FB3B0446645F696400645C0EC4B74B052F9E2EF0C3810004' },  operationType: 'replace', 
 clusterTime:   
  Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1548865599 }, 
 fullDocument:
   { _id: 5c0ec4b74b052f9e2ef0c381,
     title: 'PS I Love You',
     year: 2007,
     ...
     awards: { wins: 2, nominations: 4, text: '2 wins & 4 nominations.' },
     type: 'movie' },
  ns: { db: 'video', coll: 'movieDetails' },
  documentKey: { _id: 5c0ec4b74b052f9e2ef0c381 }
 }

在上述的返回中可以快速的找到此次change stream的重要信息,即通過operationType了解到變動的類型,有關(guān)完整的返回說明請參考 [Change Events documentation]。當(dāng)監(jiān)聽某一個collection的時候,operationType的值通常是 insert , update , replace , delete 或 invalidate ,前四種的含義通過名字可以清楚的獲知,上述返回的replace類型是我們通過Compass同collection進(jìn)行replace操作的反饋。

當(dāng)我們監(jiān)聽的collection被drop、改名或者其所屬的db被drop的時候,我們將會看到類型為invalidate的operationType。于此同時這也意味著是時候關(guān)閉change stream了。上述返回中剩下的部分是變動的詳細(xì)信息,變動發(fā)生在什么namespace,數(shù)據(jù)是什么樣的,何時發(fā)生的變更。

以上的示例是在MongoDB4.x版本中生成的,相比3.6版本,4.x版本新增了一個_data字段。該字段是一個恢復(fù)token(resume token),應(yīng)用程序能夠在重連后從該點(diǎn)進(jìn)行繼續(xù)監(jiān)聽。

Beyond Collections

如果你只需要針對某一個collection進(jìn)行變動監(jiān)聽,MongoDB3.6就可以滿足你的需求,但是對于那些此前通過oplog來進(jìn)行變動監(jiān)聽的同學(xué),他們的訴求往往是希望監(jiān)聽數(shù)據(jù)庫中的所有變動,以此來將變動應(yīng)用到其他系統(tǒng)中。MongoDB4.0很好的滿足了這個訴求,在4.0版本中我們可以針對若干個數(shù)據(jù)庫或者整個實(shí)例(復(fù)制集或者sharding)進(jìn)行變動監(jiān)聽。與 watch()某一個collection不同,4.0中我們可以 watch()某個數(shù)據(jù)庫或者整個實(shí)例。

javascript
const MongoClient = require("mongodb").MongoClient;
const uri ="MONGODBURL";
undefined
const client = new MongoClient(uri, { useNewUrlParser: true });
client.connect().then(db => {
 const changeStream = client.watch();
 changeStream.on("change", next => {
   console.log(next);
});

上述示例將對于任何數(shù)據(jù)庫、任何表的任何變動進(jìn)行輸出,這些也不是我們所捕獲的全部信息。由于我們將監(jiān)聽范圍放到了最廣,我們也將會看到在刪除collection時候的刪除事件、刪除數(shù)據(jù)庫的時間以及重命名collection的事件。

What Next?

我們可以根據(jù)實(shí)際需要選擇監(jiān)聽某一個collection的變動、或者某個數(shù)據(jù)庫中所有collection的變動又或者是整個實(shí)例中所有的數(shù)據(jù)庫與collection的變動。需要注意的是創(chuàng)建新collection、數(shù)據(jù)庫的變動將不會被直接監(jiān)聽到,不過我們可以通過變動中的內(nèi)容間接獲知。

當(dāng)然,這也不是什么大問題,如果我們希望監(jiān)聽數(shù)據(jù)庫或者collection的創(chuàng)建,我們可以通過變動內(nèi)容中的collection來判斷是否該表為此前未創(chuàng)建的新表這一方法進(jìn)行。另外,索引的創(chuàng)建由于不是為表數(shù)據(jù)變動也不會被監(jiān)聽捕獲。

MongoDB4.0為我們帶來了一個全新且強(qiáng)大的數(shù)據(jù)變動監(jiān)聽方式,尤其是該方式可以實(shí)時進(jìn)行變動捕獲。我們十分建議你去嘗試下這個功能。Change Stream的詳細(xì)文檔可以參考[Change Streams]。如果你還未安裝MongoDB4.0實(shí)例,你也可以在MongoDB Atlas中[注冊]并獲取M0的免費(fèi)集群節(jié)點(diǎn)進(jìn)行學(xué)習(xí)和測試。

譯者:周李洋
Teambition運(yùn)維總監(jiān)
MongoDB中文社區(qū)組委會成員


當(dāng)前文章:【五分鐘了解MongoDB】ChangeStream和MongoDB4.x
當(dāng)前鏈接:http://weahome.cn/article/ipeogh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部