<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MongoDB 技術專欄 彙整 - 歐立威科技</title>
	<atom:link href="https://www.omniwaresoft.com.tw/techcolumn/mongodb-techcolumn/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.omniwaresoft.com.tw/techcolumn/mongodb-techcolumn/</link>
	<description>歐立威科技 Omniwaresoft｜全方位企業級開源軟體解決方案</description>
	<lastBuildDate>Tue, 27 Jan 2026 07:52:13 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.4</generator>

<image>
	<url>https://www.omniwaresoft.com.tw/wp-content/uploads/2022/12/android-icon-192x192-1.png</url>
	<title>MongoDB 技術專欄 彙整 - 歐立威科技</title>
	<link>https://www.omniwaresoft.com.tw/techcolumn/mongodb-techcolumn/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">242464019</site>	<item>
		<title>運用 Kafka 實現 CDC 資料同步 &#8211; 以 MongoDB 為例</title>
		<link>https://www.omniwaresoft.com.tw/techcolumn/kafka-techcolumn/using-kafka-for-cdc-with-mongodb/</link>
		
		<dc:creator><![CDATA[Omni]]></dc:creator>
		<pubDate>Thu, 27 Oct 2022 08:09:08 +0000</pubDate>
				<category><![CDATA[Kafka 技術專欄]]></category>
		<category><![CDATA[MongoDB 技術專欄]]></category>
		<category><![CDATA[CDC]]></category>
		<category><![CDATA[Kafka]]></category>
		<category><![CDATA[MongoDB]]></category>
		<guid isPermaLink="false">http://www.omniwaresoft.com.tw/?p=18311</guid>

					<description><![CDATA[本文以透過 MongoDB Kafka Connector 實現 MongoDB 集群間的資料同步為例，開源的 Kafka Connect 外掛程式有 Debezium MongoDB Connector 和 MongoDB Kafka Connector 。本文旨在提供讀者自行架設簡易測試環境的步驟作為參考，並用以驗證資料庫間的資料串流功能。]]></description>
										<content:encoded><![CDATA[<h2><strong>前言</strong></h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>關於 CDC 技術的簡介及<a href="https://www.omniwaresoft.com.tw/product-news/kafka-news/kafka-introduction/" target="_blank" rel="noopener"> Kafka</a> 如何用在 CDC，可以參考文章<a href="https://www.omniwaresoft.com.tw/product-news/kafka-news/what-is-cdc/" target="_blank" rel="noreferrer noopener">「淺談 Change Data Capture (CDC) 及重要性，它如何實現資料同步？」</a>的介紹。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>我們會以透過 MongoDB Kafka Connector 實現 MongoDB 集群間的資料同步為例，開源的 Kafka Connect 外掛程式有 Debezium MongoDB Connector 和 MongoDB Kafka Connector 等，下表作簡單比較：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:table --></p>
<figure>
<table>
<thead>
<tr>
<th data-align="center">工具</th>
<th data-align="center">Debezium MongoDB Connector</th>
<th data-align="center">MongoDB Kafka Connector</th>
</tr>
</thead>
<tbody>
<tr>
<td data-align="center">支援性</td>
<td data-align="center">僅提供來源端連接器驅動程式</td>
<td data-align="center">提供來源端及目的端連接器驅動程式</td>
</tr>
<tr>
<td data-align="center">同步機制</td>
<td data-align="center">Oplog Mode (~v1.9) Change Streams Mode (v1.8+)</td>
<td data-align="center">Change Streams Mode</td>
</tr>
<tr>
<td data-align="center">接收端 CDC 資料處理</td>
<td data-align="center">需搭配 MongoDB Kafka Connector 提供的 Debezium CDC Handler</td>
<td data-align="center">MongoDB CDC Handler</td>
</tr>
<tr>
<td data-align="center">作用 MongoDB 節點</td>
<td data-align="center">僅支援單一節點 Replica Set/Sharded Cluster</td>
<td data-align="center">支援多節點 Replica Set/Sharded Cluster</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph --></p>
<p>本文旨在提供讀者自行架設簡易測試環境的步驟作為參考，並用以驗證資料庫間的資料串流功能。以下內容將著重在說明如何建置 Kafka 服務及設定資料同步的工作。 </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"fontSize":"medium"} --></p>
<h2>你需要準備</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul>
<li style="list-style-type: none;">
<ul><!-- wp:list-item --></ul>
</li>
</ul>
<ul>
<li style="list-style-type: none;">
<ul>
<li>一台已安裝 Linux 穩定發行版本的 VM 或實體機器，本文使用 CentOS 7。 建議配置：
<ul>
<li style="list-style-type: none;">
<ul>
<li>vCPUs: 4 以上</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>RAM: 8 GB 以上</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>Disk: 500 GB 以上</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>Linux 基本操作知識</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>來源端及目的端 MongoDB 集群（含連線資訊、具 <code>ChangeStreams</code> 讀取及相關表格讀寫等權限可供 Connector 工作使用的連線帳密）
<ul>
<li style="list-style-type: none;">
<ul>
<li>需為 Replica Set 或是 Sharded Cluster</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>來源端 MongoDB 表格（含資料），本文假設為 <code>mydb</code> database 下的 <code>mycoll</code> 表格</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>MongoDB 集群的連線工具，如 MongoDB Compass 或 terminal</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
<p><!-- wp:separator {"opacity":"css"} --></p>
<hr />
<p><!-- /wp:separator --></p>
<p><!-- wp:heading {"fontSize":"medium"} --></p>
<h2>環境架構</h2>
<p><img data-recalc-dims="1" fetchpriority="high" class="alignnone  wp-image-34921" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/10/mongodb-kafka-architecture.jpg?resize=507%2C142&#038;ssl=1" alt="mongodb-kafka-architecture" width="507" height="142" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/10/mongodb-kafka-architecture.jpg?resize=300%2C84&amp;ssl=1 300w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/10/mongodb-kafka-architecture.jpg?resize=1024%2C287&amp;ssl=1 1024w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/10/mongodb-kafka-architecture.jpg?resize=768%2C215&amp;ssl=1 768w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/10/mongodb-kafka-architecture.jpg?resize=1536%2C431&amp;ssl=1 1536w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/10/mongodb-kafka-architecture.jpg?w=2000&amp;ssl=1 2000w" sizes="(max-width: 507px) 100vw, 507px" /></p>
<p><!-- /wp:heading --></p>
<p><!-- wp:image {"align":"center","width":594,"height":166} --></p>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph {"align":"center"} --></p>
<p><strong>Kafka 架構示意圖</strong></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>我們在同一台機器上安裝單節點 Kafka 及 Kafka Connect，並在 Kafka Connect 中加入 MongoDB Kafka Connector 外掛程式。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">MongoDB 的 CDC 機制 (Change Streams)</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>MongoDB 的 Change Streams 功能就像資料庫的實時脈搏，它可以捕捉資料庫中發生的任何變化，並將這些變化傳遞給其他系統。</p>
<p data-sourcepos="5:1-5:24"><strong>Change Streams 如何運作？</strong></p>
<p data-sourcepos="7:1-7:86">Change Streams 會監控 MongoDB 的操作日誌 (oplog)，並將資料的異動 (例如新增、修改、刪除) 轉換成異動事件 (Change Event)。</p>
<p data-sourcepos="9:1-9:60"><strong>當 MongoDB 資料庫發生變化時，Change Streams 會捕捉這些變化，並將其傳遞給 Kafka。</strong></p>
<p data-sourcepos="11:1-11:13">更具體地說，整個流程如下：</p>
<ol data-sourcepos="13:1-17:0">
<li data-sourcepos="13:1-13:83"><strong>資料庫異動：</strong> 當來源端的 MongoDB 資料表格發生異動時，例如新增、修改或刪除文件，MongoDB 會產生新的異動事件，並記錄在 oplog 中。</li>
<li data-sourcepos="14:1-14:63"><strong>捕捉異動事件：</strong> Source Connector 會持續監控 oplog，捕捉這些異動事件，並將其集結成批次。</li>
<li data-sourcepos="15:1-15:81"><strong>發送至 Kafka：</strong> Source Connector 會將批次的異動事件發送到 Kafka Broker，並寫入指定的 Kafka Topic。</li>
<li data-sourcepos="16:1-17:0"><strong>同步至目標系統：</strong> Sink Connector 會從 Kafka Broker 讀取指定 Topic 中的資料，並根據異動事件的內容，將新的文件寫入目的端 MongoDB 的指定表格，或執行其他同步操作。</li>
</ol>
<p data-sourcepos="18:1-18:23"> </p>
<p><!-- /wp:list-item --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">Kafka 服務相關元件和名詞介紹</h3>
<p data-sourcepos="3:1-3:74">在 Kafka 的訊息旅程中，許多幕後推手扮演著重要的角色，確保訊息能順利地從生產者傳遞到消費者。以下介紹 Kafka 服務中幾個關鍵的元件和名詞：</p>
<p data-sourcepos="5:1-5:8"><strong>協調者：</strong></p>
<ul data-sourcepos="7:1-8:0">
<li data-sourcepos="7:1-8:0"><strong>ZooKeeper：</strong> 如同一位經驗豐富的指揮家，ZooKeeper 負責協調 Kafka 各服務節點的狀態管理和工作分配，確保整個系統的穩定運行。在 Kafka 2.8.0 以後的版本，Kafka 引入了 KRaft 模式，可以脫離 ZooKeeper 運作，更加輕量化和高效。</li>
</ul>
<p data-sourcepos="9:1-9:10"><strong>訊息的歸宿：</strong></p>
<ul data-sourcepos="11:1-14:0">
<li data-sourcepos="11:1-11:58"><strong>Broker：</strong> Kafka 的節點，如同一個個郵局，負責處理對 Topic 寫入或讀取資料的請求。</li>
<li data-sourcepos="12:1-12:45"><strong>Topic：</strong> 存放資料的容器，如同郵局中的郵箱，用於存放不同類型的訊息。</li>
<li data-sourcepos="13:1-14:0"><strong>Partition：</strong> Topic 的分割，如同將郵箱分成多個隔層，讓 Consumer 可以同時拉取不同 Partition 中的資料，提升處理效率。</li>
</ul>
<p data-sourcepos="15:1-15:15"><strong>訊息的生產者和消費者：</strong></p>
<ul data-sourcepos="17:1-19:0">
<li data-sourcepos="17:1-17:62"><strong>Producer：</strong> 將資料送往 Kafka Broker 寫入的資料製造者，如同寄件人，將訊息投遞到郵箱。</li>
<li data-sourcepos="18:1-19:0"><strong>Consumer / Consumer Groups：</strong> Topic 訊息的消費者，如同收件人，從郵箱中取出訊息。同一個 Topic 可能有很多個消費者，因此以群組形式存在，確保每個訊息都能被消費。</li>
</ul>
<p data-sourcepos="20:1-20:14"><strong>訊息旅程的可靠保障：</strong></p>
<ul data-sourcepos="22:1-23:0">
<li data-sourcepos="22:1-23:0"><strong>Leader / Followers：</strong> Kafka 通常以多節點集群的形式運作，集群中會有一個主要節點作為主節點 (Leader)，其他節點則為副節點 (Followers)，從主節點同步狀態及資料，確保訊息的可靠性和容錯能力。</li>
</ul>
<p data-sourcepos="24:1-24:12"><strong>資料同步的橋樑：</strong></p>
<ul data-sourcepos="26:1-31:0">
<li data-sourcepos="26:1-26:61"><strong>Kafka Connect：</strong> 負責 Connector 的管理，如同一位聯絡員，負責協調資料的同步工作。</li>
<li data-sourcepos="27:1-27:83"><strong>plugin：</strong> 供 Kafka Connect 使用的外掛驅動程式，如同不同的轉接頭，讓 Kafka Connect 可以連接到不同的資料庫或系統。</li>
<li data-sourcepos="28:1-28:100"><strong>Connector：</strong> 與外部資料環境及 Kafka 對接，用來進行指定讀/寫資料工作的單位，如同一位搬運工，負責將資料從來源系統搬運到 Kafka，或從 Kafka 搬運到目標系統。</li>
<li data-sourcepos="29:1-31:0"><strong>Worker / Worker Task：</strong> 一個 Sink Connector 下依據 Topic partition 數目可以有一或多個 process 平行執行 Connector 設定中定義的工作，如同多位搬運工同時工作，提升資料同步的效率。</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
<p><!-- wp:separator {"opacity":"css"} --></p>
<hr />
<p><!-- /wp:separator --></p>
<p><!-- wp:heading {"fontSize":"medium"} --></p>
<h2>操作步驟</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">一、下載 Apache Kafka</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:code --></p>
<pre><code>curl &lt;https://downloads.apache.org/kafka/3.3.1/kafka_2.13-3.3.1.tgztar&gt; -zvf kafka_2.13-3.3.1.tgzcd kafka_2.13-3.3.1</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">二、啟動 Kafka 服務</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:code --></p>
<pre><code>./bin/kafka-server-start.sh</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>Kafka 預設使用 port 9092。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">三、啟動 Kafka Connect 服務</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Kafka Connect 分有 standalone (預設使用 <code>./config/connect-standalone.properties</code> 中的設定) 及 distributed (預設使用 <code>./config/connect-distributed.properties</code> 中的設定)。差異在於 distributed 版本支援分散儲存 topic 中的資料，一般建議使用 distributed 版本</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>在啟動 Kafka Connect 之前，我們需要先安裝 MongoDB Kafka Connector 外掛，在啟動 Kafka Connect 服務時才會讀取到該外掛程式的存在。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>開啟 <code>connect-distributed.properties</code>，往下滾動至最底部，找到 <code>plugin.path</code> 一行，修改為您要放置外掛檔案的路徑位置。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>vi ./config/connect-distributed.properties</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>下載外掛程式並移至 <code>.properties</code> 中指定 <code>plugin.path</code> 即可，這邊假設為 <code>kafka_2.13-3.3.1/plugins</code>。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>curl &lt;https://search.maven.org/remotecontent?filepath=org/mongodb/kafka/mongo-kafka-connect/1.8.0/mongo-kafka-connect-1.8.0-all.jarmkdir&gt; -p pluginscp mongo-kafka-connect-1.8.0-all.jar plugins</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>再來啟動 Kafka Connect，預設使用 port 8083</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>./bin/connect-distributed.sh</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>可以透過以下指令查看已安裝的 Kafka connector plugins，此時應該要看得到 <code>MongoSourceConnector</code> 及 <code>MongoSinkConnector</code>。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>curl &lt;http://localhost:8083/connector-plugins&gt;</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">四、新增 Source Connector</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Kafka Connect 提供 REST API 管理執行中的 connector 工作，包含新增 connector、查看 connector 設定內容、變更 connector 設定內容、刪除 connector 等。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>在新增 connector 時透過 API 傳入的設定為 json 格式，為方便可以將設定存為檔案再由指令呼叫設定檔內容。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>以下提供 source connector 範例及常用設定表列說明。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>mongo-src-connector.json
{   
"name": "mongo-src-connector",    
"config": {        
"connector.class": "com.mongodb.kafka.connect.MongoSourceConnector",
"connection.uri": "mongodb://admin:password@mymongosrc1:27017,mymongosrc2:27017,mymongosrc3:27017", 
"database": "mydb", 
"collection": "mycoll",        
"topic.prefix": "src",        
"copy.existing": true,       
"key.converter": "org.apache.kafka.connect.json.JsonConverter",        "key.converter.schemas.enable": "false",       
"value.converter": "org.apache.kafka.connect.json.JsonConverter",        "value.converter.schemas.enable": "false",        
"tasks.max": "1"    }
}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:table {"className":"is-style-regular"} --></p>
<figure>
<table>
<thead>
<tr>
<th data-align="center">設定參數</th>
<th data-align="center">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td data-align="center">name</td>
<td data-align="center">用以辨別此 Connector 工作的名稱</td>
</tr>
<tr>
<td data-align="center">connector.class</td>
<td data-align="center">Kafka connector plugin 的 class 名稱</td>
</tr>
<tr>
<td data-align="center">connection.uri</td>
<td data-align="center">MongoDB 集群連線字串密碼若包含特殊符號如@，需要轉換為 <a href="https://zh.wikipedia.org/zh-tw/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81" target="_blank" rel="noreferrer noopener">URL Encoding</a></td>
</tr>
<tr>
<td data-align="center">database</td>
<td data-align="center">指定監聽異動的 database 名稱未指定 database 及 collection 時監聽範圍為整個集群</td>
</tr>
<tr>
<td data-align="center">collection</td>
<td data-align="center">指定監聽異動的 collection 名稱，此參數只支援單一 collection未指定 collection 時監聽範圍為整個指定 database</td>
</tr>
<tr>
<td data-align="center">topic.prefix</td>
<td data-align="center">指定目標 kafka topic 的前綴字串</td>
</tr>
<tr>
<td data-align="center">topic.suffix</td>
<td data-align="center">指定目標 kafka topic 的後綴字串</td>
</tr>
<tr>
<td data-align="center">copy.existing</td>
<td data-align="center">設定是否複製 collection 內既有資料，預設為 false</td>
</tr>
<tr>
<td data-align="center">task.max</td>
<td data-align="center">此 Connector 可以使用的 Worker Task 上限，預設為 1</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph --></p>
<p>我們需要先建立 Kafka Topic，才能讓 Connector 透過 Broker 寫入</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>./bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic src.mydb.mycoll --replication-factor 3 --partition 1</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p><strong>｜</strong>replication-factor: 一共會有幾份相同的 topic，建議 production 設定為 3</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>確認剛才建立的 topic 資訊</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>./bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic src.mydb.mycoll</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>之後便可透過以下指令啟動 Source Connector</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>curl -X POST &lt;http://localhost:8083/connectors&gt; -H "Accept:application/json" -H "Content-Type:application/json" -d @mongo-src-connector.json</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">五、觀察 Kafka Topic 內容</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>我們先來確認 Source Connector 有正常啟動（無錯誤訊息且狀態為 RUNNING），以及表格資料是否如預期寫入 Kafka topic。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">六、檢查 Connector 狀態</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:code --></p>
<pre><code>curl &lt;http://localhost:8083/connectors/mongo-src-connector/status&gt;</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">七、列出所有 Kafka topics</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:code --></p>
<pre><code>./bin/kafka-topics.sh --bootstrap-server localhost:9092 --list</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">八、查看 Kafka topic 內資料</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:code --></p>
<pre><code>./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic src.mydb.mycoll</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">九、新增 Sink Connector</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:code --></p>
<pre><code>mongo-sink-connector.json
{   
"name": "mongo-sink-connector",   
"config": {        
"connector.class": "com.mongodb.kafka.connect.MongoSinkConnector",        
"connection.uri": "mongodb://admin:password@mymongosink1:27017,mymongosink2:27017,mymongosink3:27017",
"topics": "src.mydb.mycoll",        
"database": "sinkdb",        
"collection": "sinkcoll",        
"key.converter": "org.apache.kafka.connect.json.JsonConverter",        "key.converter.schemas.enable": "false",        
"value.converter": "org.apache.kafka.connect.json.JsonConverter",        "value.converter.schemas.enable": "false",        
"change.data.capture.handler": "com.mongodb.kafka.connect.sink.cdc.mongodb.ChangeStreamHandler",        
"tasks.max": "1"    }
}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>接著便可透過以下指令啟動 Sink Connector</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>curl -X POST &lt;http://localhost:8083/connectors&gt; -H "Accept:application/json" -H "Content-Type:application/json" -d @mongo-sink-connector.json</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">十、觀察結果</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>在確認 Sink Connector 正常啟動後，同步工作至此已經架設完成。您可以參考以下指令，在先前建立的 connector 工作持續運作的狀態下，連線到來源端 MongoDB 進行操作。透過另一個連線，在目的端 MongoDB 表格結果是否與來源端一致。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul>
<li style="list-style-type: none;">
<ul><!-- wp:list-item --></ul>
</li>
</ul>
<ul>
<li style="list-style-type: none;">
<ul>
<li>連線至 MongoDB</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
<p><!-- wp:code --></p>
<pre><code>mongosh mongodb://admin:password@mymongosink1:27017,mymongosink2:27017,mymongosink3:27017</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:list --></p>
<ul>
<li style="list-style-type: none;">
<ul><!-- wp:list-item --></ul>
</li>
</ul>
<ul>
<li style="list-style-type: none;">
<ul>
<li>自來源端表格新增一筆資料</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
<p><!-- wp:code --></p>
<pre><code>use mydb
db.mycoll.insertOne({ name: "TestField" });</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>Output:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>{ acknowledged: true,
  insertedId: ObjectId("63686963a37df5cdbf7fec9d") }</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:quote --></p>
<blockquote>
<p><!-- wp:paragraph --></p>
<p><strong>在目標資料庫的表格 <code>sinkdb.sinkcoll</code> 會看到新增了一筆連 <code>ObjectId</code> 都與來源端一模一樣的資料</strong></p>
</blockquote>
<ul>
<li style="list-style-type: none;">
<ul>
<li>自來源端表格更新一筆資料</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
<p><!-- wp:code --></p>
<pre><code>db.mycoll.updateOne({name: "TestField"}, {$set:{newField: true}});</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>Output:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>{ acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0 }</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:quote --></p>
<blockquote>
<p><!-- wp:paragraph --></p>
<p><strong>在目標資料庫的表格會看到這筆資料多了一個欄位 <code>newField</code></strong></p>
</blockquote>
<ul>
<li style="list-style-type: none;">
<ul>
<li>自來源端表格刪除一筆資料</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
<p><!-- wp:code --></p>
<pre><code>db.mycoll.deleteOne({name: "TestField", newField: true})</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>Output:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>{ acknowledged: true, deletedCount: 1 }</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:quote --></p>
<blockquote>
<p><!-- wp:paragraph --></p>
<p><strong>在目標資料庫的表格會看到這筆資料也跟著被刪除</strong></p>
<p><!-- /wp:paragraph --></p>
</blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:paragraph --></p>
<p>收尾</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>如果要結束測試，一樣可以透過 curl 呼叫 API 來停止 connector 工作。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>curl -X DELETE &lt;http://localhost:8083/connectors/mongo-src-connector&gt;
curl -X DELETE &lt;http://localhost:8083/connectors/mongo-sink-connector&gt;</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"fontSize":"medium"} --></p>
<h2>結語</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>本文中我們示範了如何自行架設 Kafka 環境，以及簡單驗證資料庫間利用 CDC 機制同步資料的功能。透過開源的 CDC 同步方案，我們可以更有效地進行巨量資料庫間資料的複製與轉移，並確保資料的一致性。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"fontSize":"medium"} --></p>
<p>參考資料：<a href="https://www.mongodb.com/docs/kafka-connector/current/" target="_blank" rel="noopener">MongoDB Kafka Connector 官方文件</a></p>
<p><!-- /wp:heading --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol>
<li style="list-style-type: none;">
<ol><!-- wp:list-item --></ol>
</li>
</ol>
<p>有興趣歡迎 <a href="https://www.omniwaresoft.com.tw/contact/" target="_blank" rel="noopener">聯繫我們</a>，或加入 <a href="https://lin.ee/VCvhQSK" target="_blank" rel="noopener">歐立威 LINE 好友</a>，了解更多產品資訊！</p>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
<p><!-- wp:separator {"opacity":"css","className":"is-style-wide"} --></p>
<hr />
<p><!-- /wp:separator --></p>
<p><!-- wp:block {"ref":34920} /--></p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">18311</post-id>	</item>
		<item>
		<title>MongoDB CRUD基本觀念</title>
		<link>https://www.omniwaresoft.com.tw/techcolumn/mongodb-techcolumn/mongodb-crud/</link>
		
		<dc:creator><![CDATA[Omni]]></dc:creator>
		<pubDate>Mon, 05 Oct 2020 02:33:38 +0000</pubDate>
				<category><![CDATA[MongoDB 技術專欄]]></category>
		<category><![CDATA[CRUD]]></category>
		<category><![CDATA[MongoDB]]></category>
		<guid isPermaLink="false">http://www.omniwaresoft.com.tw/?p=14873</guid>

					<description><![CDATA[MongoDB Create 新增或插入...]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="14873" class="elementor elementor-14873" data-elementor-post-type="post">
						<section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-top-section elementor-element elementor-element-e345c8a elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="e345c8a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-thegem"><div class="elementor-row">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-39f04d9e" data-id="39f04d9e" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-30324b3f flex-horizontal-align-default flex-horizontal-align-tablet-default flex-horizontal-align-mobile-default flex-vertical-align-default flex-vertical-align-tablet-default flex-vertical-align-mobile-default elementor-widget elementor-widget-text-editor" data-id="30324b3f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
												<div class="elementor-text-editor elementor-clearfix">
						<p></p>
<h2 class="wp-block-heading"><strong>MongoDB </strong><strong>Create</strong></h2>
<p></p>
<p></p>
<p><strong>新增或插入操作將新文檔添加到collection</strong><strong>之中。如果collection</strong><strong>當前不存在，則會插入操作將新增collection</strong><strong>。</strong></p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li>
<h3><strong>db.collection.insert()</strong></h3>
</li>
<p></p></ul>
<p></p>
<p></p>
<h4 class="wp-block-heading">單筆文檔：將單個文檔插入collection中</h4>
<p></p>
<p></p>
<p><strong>新增一個新文檔</strong></p>
<p></p>
<p></p>
<figure class="wp-block-image"><img width="312" height="162" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-27.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14945" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-27.png?w=312&amp;ssl=1 312w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-27.png?resize=300%2C156&amp;ssl=1 300w" sizes="(max-width: 312px) 100vw, 312px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>nInserted: 新增多少筆文檔</strong></p>
<p></p>
<p></p>
<p><code>WriteResult({ "nInserted" : 1 })</code></p>
<p></p>
<p></p>
<h4 class="wp-block-heading">多筆文檔：將多筆文檔插入collection中</h4>
<p></p>
<p></p>
<p><strong>新增多個文檔</strong></p>
<p></p>
<p></p>
<figure class="wp-block-image"><img width="350" height="91" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-28.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14946" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-28.png?w=350&amp;ssl=1 350w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-28.png?resize=300%2C78&amp;ssl=1 300w" sizes="(max-width: 350px) 100vw, 350px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>回傳一個BulkWriteResult物件</strong></p>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="347" height="202" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-29.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14947" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-29.png?w=347&amp;ssl=1 347w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-29.png?resize=300%2C175&amp;ssl=1 300w" sizes="(max-width: 347px) 100vw, 347px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p>&nbsp;</p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li>
<h3><strong>db.collection.insertOne()</strong></h3>
</li>
<p></p></ul>
<p></p>
<p></p>
<h4 class="wp-block-heading">將單個文檔插入collection中</h4>
<p></p>
<p></p>
<p><strong>新增一個新文檔</strong></p>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="318" height="175" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-30.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14949" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-30.png?w=318&amp;ssl=1 318w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-30.png?resize=300%2C165&amp;ssl=1 300w" sizes="(max-width: 318px) 100vw, 318px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>回傳一個BulkWriteResult物件</strong></p>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="314" height="45" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-32.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14951" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-32.png?w=314&amp;ssl=1 314w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-32.png?resize=300%2C43&amp;ssl=1 300w" sizes="(max-width: 314px) 100vw, 314px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p>&nbsp;</p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li>
<h3><strong>db.collection.insertMany()</strong></h3>
</li>
<p></p></ul>
<p></p>
<p></p>
<h4 class="wp-block-heading">將多個文檔插入collection中</h4>
<p></p>
<p></p>
<p><strong>新增多筆文檔</strong></p>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="360" height="91" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-33.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14952" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-33.png?w=360&amp;ssl=1 360w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-33.png?resize=300%2C76&amp;ssl=1 300w" sizes="(max-width: 360px) 100vw, 360px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>回傳一個BulkWriteResult物件</strong></p>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="375" height="122" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-34.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14953" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-34.png?w=375&amp;ssl=1 375w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-34.png?resize=300%2C98&amp;ssl=1 300w" sizes="(max-width: 375px) 100vw, 375px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<h2 class="wp-block-heading"><strong>MongoDB </strong><strong>Read</strong></h2>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li> <strong style="color: rgb(60, 57, 80); font-size: 25px; letter-spacing: 0.05em; text-transform: uppercase;">從collection中讀取操作文檔，在collection中查詢文檔</strong> </li>
<p></p></ul>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>空查詢過濾器文檔({})選擇collection中的所有文檔。</strong></p>
<p></p>
<p></p>
<p><code>db.collection.find({})</code></p>
<p></p>
<p></p>
<p><strong>將查詢過濾器文檔省略到db.collection.find()等同於指定空查詢文檔。&nbsp;</strong></p>
<p></p>
<p></p>
<p><code>db.collection.find()</code></p>
<p></p>
<p></p>
<p><strong>查詢單一個符合條件的第一個文檔，並且會以pretty()的方法呈現。</strong></p>
<p></p>
<p></p>
<p><code>db.collection.findOne()</code></p>
<p></p>
<p></p>
<p>&nbsp;</p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li> <strong style="color: rgb(60, 57, 80); font-size: 25px; letter-spacing: 0.05em; text-transform: uppercase;">查詢方式</strong> </li>
<p></p></ul>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>MongoDB提供db.collection.find()方法來從collection中讀取文檔。該方法將游標返回到匹配的文檔。</strong></p>
<p></p>
<p></p>
<p><code>db.collection.find(&lt;query filter&gt;, &lt;projection&gt;)</code></p>
<p></p>
<p></p>
<p>&lt;query filter&gt;：查詢過濾器，用於指定要返回的文檔。</p>
<p></p>
<p></p>
<p>&lt;projection&gt;：一個查詢投影，用於指定要返回的匹配文檔中的哪個字段。</p>
<p></p>
<p></p>
<p>&nbsp;</p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li> <strong style="color: rgb(60, 57, 80); font-size: 25px; letter-spacing: 0.05em; text-transform: uppercase;">指定查詢過濾條件</strong> </li>
<p></p></ul>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>指定相等條件</strong></p>
<p></p>
<p></p>
<p><code>{ &lt;field1&gt; : &lt;value1&gt;, ... }</code></p>
<p></p>
<p></p>
<p>範例：</p>
<p></p>
<p></p>
<p><code>db.employees.find( { name : "SMITH" } )</code></p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li> <strong style="color: rgb(60, 57, 80); font-size: 25px; letter-spacing: 0.05em; text-transform: uppercase;">使用查詢運算符指定條件</strong> </li>
<p></p></ul>
<p></p>
<p></p>
<p></p>
<p></p>
<p><code>{ &lt;field1&gt;&nbsp; :&nbsp; { &lt;operator1&gt; : &lt;value1&gt; ,&nbsp; ... }</code></p>
<p></p>
<p></p>
<p>範例：</p>
<p></p>
<p></p>
<p><code>db.emplyees.find( { name : { $in : [ "SMITH" , "ALLEN" ] } } )</code></p>
<p></p>
<p></p>
<p>&nbsp;</p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li> <strong style="color: rgb(60, 57, 80); font-size: 25px; letter-spacing: 0.05em; text-transform: uppercase;">指定AND條件</strong> </li>
<p></p></ul>
<p></p>
<p></p>
<p></p>
<p></p>
<p><code>db.employees.find( { empno : 7499 , name : "ALLEN" } )</code></p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li> <strong style="color: rgb(60, 57, 80); font-size: 25px; letter-spacing: 0.05em; text-transform: uppercase;">指定OR條件</strong> </li>
<p></p></ul>
<p></p>
<p></p>
<p></p>
<p></p>
<p><code>db.employees.find( { $or : [ { deptno : 30 } , { sal : { $lt : 1000 } } ] } )</code></p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li> <strong style="color: rgb(60, 57, 80); font-size: 25px; letter-spacing: 0.05em; text-transform: uppercase;">指定AND以及OR條件</strong> </li>
<p></p></ul>
<p></p>
<p></p>
<p></p>
<p></p>
<p><code>db.employees.find( { deptno : 30 , $or : [ { deptno : 30 } , { sal : { $lt : 1000&nbsp; } } ] } )</code></p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li> <strong style="color: rgb(60, 57, 80); font-size: 25px; letter-spacing: 0.05em; text-transform: uppercase;">投影文檔</strong> </li>
<p></p></ul>
<p></p>
<p></p>
<p><strong>投影文檔限制所有匹配文檔的返回字段，他可以指定字段的包含/排除。</strong></p>
<p></p>
<p></p>
<p><span style="color: #000000;"><code>{ field1 : &lt;value&gt;, field2 : &lt;value&gt; ... }</code></span></p>
<p></p>
<p></p>
<p>&lt;value&gt;可以是以下任何一種：</p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li>1或true為包括該字段</li>
<p></p>
<p></p>
<li>0或false為排除該字段</li>
<p></p></ul>
<p></p>
<p></p>
<p></p>
<p></p>
<figure class="wp-block-image size-large"><img loading="lazy" data-recalc-dims="1" height="84" width="1024" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/code1.png?resize=1024%2C84&#038;ssl=1" alt="code" class="wp-image-31470" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/code1.png?w=2129&amp;ssl=1 2129w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/code1.png?resize=300%2C25&amp;ssl=1 300w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/code1.png?resize=1024%2C84&amp;ssl=1 1024w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/code1.png?resize=768%2C63&amp;ssl=1 768w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/code1.png?resize=1536%2C126&amp;ssl=1 1536w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/code1.png?resize=2048%2C168&amp;ssl=1 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p></p>
<p></p>
<figure class="wp-block-image size-full"><img loading="lazy" width="864" height="104" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/code2.png?w=1170&#038;ssl=1" alt="code2" class="wp-image-31471" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/code2.png?w=864&amp;ssl=1 864w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/code2.png?resize=300%2C36&amp;ssl=1 300w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/code2.png?resize=768%2C92&amp;ssl=1 768w" sizes="(max-width: 864px) 100vw, 864px" /></figure>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li>
<h3><strong>查詢Null或缺少字段</strong></h3>
</li>
<p></p></ul>
<p></p>
<p></p>
<p><strong>平等過濾器</strong></p>
<p></p>
<p></p>
<p><code>db.emplyees.find( { name : "SMITH" , sex : null } )</code></p>
<p></p>
<p></p>
<p><strong>類型檢查(BSON Type)</strong></p>
<p></p>
<p></p>
<p><code>db.emplyees.find( { name : "SMITH" , sex : { $type : 10 } } )</code></p>
<p></p>
<p></p>
<p><strong>存在檢查</strong></p>
<p></p>
<p></p>
<p><code>db.emplyees.find( { sex : { $exists : false } } )</code></p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li>
<h3><strong>在mongo shell中迭代一個游標</strong></h3>
</li>
<p></p></ul>
<p></p>
<p></p>
<p><strong>手動迭代游標</strong></p>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="437" height="72" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-7.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14909" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-7.png?w=437&amp;ssl=1 437w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-7.png?resize=300%2C49&amp;ssl=1 300w" sizes="(max-width: 437px) 100vw, 437px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>與forEach()相同</strong></p>
<p></p>
<p></p>
<p><code>var mCur = db.emplyees.find( { deptno : 30 } )<br></code><code>mCur.forEach( printjson );</code></p>
<p></p>
<p></p>
<p><strong>迭代索引：</strong><strong>toArray()迭代方法並以陣列形式傳回文檔</strong></p>
<p></p>
<p></p>
<p><code>var mCUR = db.employees.find( { deptno : 30 } );</code><br><code>var docAry = mCur.toArray();</code><br><code>var mDoc = docAry[3];</code><br><code>printjson( mDoc )</code></p>
<p></p>
<p></p>
<h2 class="wp-block-heading"><strong>MongoDB </strong><strong>Update</strong></h2>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li>
<h3><strong>更新操作可修改collection</strong><strong>中的現有文檔</strong></h3>
<p></p>
<ul class="wp-block-list"><p></p>
<li><code><strong>db.collection.update()</strong></code></li>
<p></p>
<p></p>
<li><code><strong>db.collection.updateOne()</strong></code></li>
<p></p>
<p></p>
<li><code><strong>db.collection.updateMany()</strong></code></li>
<p></p>
<p></p>
<li><code><strong>db.collection.replaceOne()</strong></code></li>
<p></p></ul>
<p></p></li>
<p></p>
<p></p>
<li>
<h3><strong>要更新文檔中的字段，MongoDB</strong><strong>提供更新運算符，例如$set</strong><strong>來修改值</strong></h3>
</li>
<p></p></ul>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="512" height="118" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-35.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14964" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-35.png?w=512&amp;ssl=1 512w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-35.png?resize=300%2C69&amp;ssl=1 300w" sizes="(max-width: 512px) 100vw, 512px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>如果字段不存在，某些更新運算符(如$set)將新增該字段。</strong></p>
<p></p>
<p></p>
<p><code>db.collection.update()</code></p>
<p></p>
<p></p>
<p><strong>更新單個紀錄(比如：<code>db.collection.updateOne()</code>)</strong></p>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="531" height="91" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-9.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14912" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-9.png?w=531&amp;ssl=1 531w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-9.png?resize=300%2C51&amp;ssl=1 300w" sizes="(max-width: 531px) 100vw, 531px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>更新多個紀錄(比如：<code>db.collection.updateMany()</code>)</strong></p>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="531" height="106" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-10.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14913" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-10.png?w=531&amp;ssl=1 531w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-10.png?resize=300%2C60&amp;ssl=1 300w" sizes="(max-width: 531px) 100vw, 531px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li>
<h3>替換文檔</h3>
</li>
<p></p></ul>
<p></p>
<p></p>
<p><code>db.collection.replaceOne()</code></p>
<p></p>
<p></p>
<p><strong>將與過濾器名稱匹配的第一個文檔替換為與新文檔相同的”SMITH”：</strong></p>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="531" height="83" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-11.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14915" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-11.png?w=531&amp;ssl=1 531w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-11.png?resize=300%2C47&amp;ssl=1 300w" sizes="(max-width: 531px) 100vw, 531px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p><code>db.collection.update()</code></p>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="531" height="83" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-12.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14916" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-12.png?w=531&amp;ssl=1 531w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-12.png?resize=300%2C47&amp;ssl=1 300w" sizes="(max-width: 531px) 100vw, 531px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p>&nbsp;</p>
<p></p>
<p></p>
<h2 class="wp-block-heading"><strong>MongoDB </strong><strong>Delete</strong></h2>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li>
<h3><strong>刪除操作從collection中刪除文檔</strong></h3>
<p></p>
<ul class="wp-block-list"><p></p>
<li><code>db.collection.remove()</code></li>
<p></p>
<p></p>
<li><code>db.collection.deleteOne()</code></li>
<p></p>
<p></p>
<li><code>db.collection.deleteMany()</code></li>
<p></p></ul>
<p></p></li>
<p></p>
<p></p>
<li>
<h3><strong>刪除所有文檔</strong></h3>
</li>
<p></p></ul>
<p></p>
<p></p>
<p>要從collection中刪除所有文檔，請將空過濾器文檔{}傳遞給<code>db.collection.remove()</code>或<code>db.collection.deleteMany()</code>。</p>
<p></p>
<p></p>
<p>但如果要從collection中刪除所有文檔，使用<code>db.collection.drop()</code>方法刪除整個collection(包括索引)會更有效。</p>
<p></p>
<p></p>
<h2 class="wp-block-heading"><strong><img loading="lazy" data-recalc-dims="1" class="alignnone size-full wp-image-14921" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-13.png?resize=550%2C50&#038;ssl=1" alt="" width="550" height="50" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-13.png?w=550&amp;ssl=1 550w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-13.png?resize=300%2C27&amp;ssl=1 300w" sizes="(max-width: 550px) 100vw, 550px" /></strong></h2>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="550" height="72" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-14.png?w=1170&#038;ssl=1" alt="" class="wp-image-14922" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-14.png?w=550&amp;ssl=1 550w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-14.png?resize=300%2C39&amp;ssl=1 300w" sizes="(max-width: 550px) 100vw, 550px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p>&nbsp;</p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li>
<h3><strong>僅刪除一個與條件匹配的文檔</strong></h3>
</li>
<p></p></ul>
<p></p>
<p></p>
<p><strong>刪除指定過濾器匹配的單個文檔，即使匹配到多個文檔</strong></p>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="568" height="52" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-15.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14923" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-15.png?w=568&amp;ssl=1 568w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-15.png?resize=300%2C27&amp;ssl=1 300w" sizes="(max-width: 568px) 100vw, 568px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>刪除所有指定過濾器匹配的文檔</strong></p>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="568" height="50" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-16.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14924" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-16.png?w=568&amp;ssl=1 568w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-16.png?resize=300%2C26&amp;ssl=1 300w" sizes="(max-width: 568px) 100vw, 568px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<h2 class="wp-block-heading"><strong>批量寫入操作</strong></h2>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li>
<h3>MongoDB提供用戶能多批量執行寫入操作。</h3>
</li>
<p></p>
<p></p>
<li>
<h3>批量寫入操作可以是有序列的，也可以是無序列的。</h3>
<p></p>
<ul class="wp-block-list"><p></p>
<li><strong>有序列的：</strong></li>
<p></p></ul>
<p></p></li>
<p></p></ul>
<p></p>
<p></p>
<p>串列操作：如果發生錯誤，將回傳而不處理任何剩餘的操作。</p>
<p></p>
<p></p>
<p><code>{ordered:true}</code></p>
<p></p>
<p></p>
<ul class="wp-block-list"><p></p>
<li><strong>無序列的：</strong></li>
<p></p></ul>
<p></p>
<p></p>
<p>並行操作：但行為無法保證，如果發生錯誤，將繼續處理剩餘程序。</p>
<p></p>
<p></p>
<p><code>{ordered:false}</code></p>
<p></p>
<p></p>
<h2 class="wp-block-heading"><strong><img loading="lazy" data-recalc-dims="1" class="alignnone wp-image-14928" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-17.png?resize=282%2C81&#038;ssl=1" alt="" width="282" height="81" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-17.png?w=418&amp;ssl=1 418w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-17.png?resize=300%2C86&amp;ssl=1 300w" sizes="(max-width: 282px) 100vw, 282px" /></strong></h2>
<p></p>
<p></p>
<h2 class="wp-block-heading"><img loading="lazy" data-recalc-dims="1" class="alignnone wp-image-14929" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-18.png?resize=187%2C178&#038;ssl=1" alt="" width="187" height="178"></h2>
<p></p>
<p></p>
<h2 class="wp-block-heading"><strong>SQL轉至MongoDB對映表—新增與更改</strong></h2>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="860" height="372" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-19.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14931" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-19.png?w=860&amp;ssl=1 860w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-19.png?resize=300%2C130&amp;ssl=1 300w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-19.png?resize=768%2C332&amp;ssl=1 768w" sizes="(max-width: 860px) 100vw, 860px" /></figure>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="862" height="200" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-20.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14933" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-20.png?w=862&amp;ssl=1 862w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-20.png?resize=300%2C70&amp;ssl=1 300w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-20.png?resize=768%2C178&amp;ssl=1 768w" sizes="(max-width: 862px) 100vw, 862px" /></figure>
<p></p>
<p></p>
<h2 class="wp-block-heading"><strong>SQL</strong><strong>轉至</strong><strong>MongoDB</strong><strong>對映表</strong><strong>—</strong><strong>查詢</strong></h2>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="862" height="350" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-21.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14934" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-21.png?w=862&amp;ssl=1 862w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-21.png?resize=300%2C122&amp;ssl=1 300w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-21.png?resize=768%2C312&amp;ssl=1 768w" sizes="(max-width: 862px) 100vw, 862px" /></figure>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="862" height="335" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-22.png?w=1170&#038;ssl=1" alt="code" class="wp-image-14935" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-22.png?w=862&amp;ssl=1 862w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-22.png?resize=300%2C117&amp;ssl=1 300w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-22.png?resize=768%2C298&amp;ssl=1 768w" sizes="(max-width: 862px) 100vw, 862px" /></figure>
<p></p>
<p></p>
<h2 class="wp-block-heading"><strong><img loading="lazy" data-recalc-dims="1" class="alignnone size-full wp-image-14936" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-23.png?resize=860%2C320&#038;ssl=1" alt="" width="860" height="320" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-23.png?w=860&amp;ssl=1 860w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-23.png?resize=300%2C112&amp;ssl=1 300w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-23.png?resize=768%2C286&amp;ssl=1 768w" sizes="(max-width: 860px) 100vw, 860px" /></strong></h2>
<p></p>
<p></p>
<h2 class="wp-block-heading"><strong><img loading="lazy" data-recalc-dims="1" class="alignnone size-full wp-image-14937" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-24.png?resize=860%2C356&#038;ssl=1" alt="" width="860" height="356" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-24.png?w=860&amp;ssl=1 860w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-24.png?resize=300%2C124&amp;ssl=1 300w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-24.png?resize=768%2C318&amp;ssl=1 768w" sizes="(max-width: 860px) 100vw, 860px" /></strong></h2>
<p></p>
<p></p>
<h2 class="wp-block-heading"><strong>SQL轉至MongoDB對映表—更新與刪除</strong></h2>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="862" height="175" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-25.png?w=1170&#038;ssl=1" alt="" class="wp-image-14938" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-25.png?w=862&amp;ssl=1 862w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-25.png?resize=300%2C61&amp;ssl=1 300w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-25.png?resize=768%2C156&amp;ssl=1 768w" sizes="(max-width: 862px) 100vw, 862px" /></figure>
<p></p>
<p></p>
<figure class="wp-block-image"><img loading="lazy" width="860" height="131" data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-26.png?w=1170&#038;ssl=1" alt="" class="wp-image-14939" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-26.png?w=860&amp;ssl=1 860w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-26.png?resize=300%2C46&amp;ssl=1 300w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2020/10/1-26.png?resize=768%2C117&amp;ssl=1 768w" sizes="(max-width: 860px) 100vw, 860px" /></figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>							</div>
										</div>
				</div>
					</div>
		</div>
					</div></div>
		</section>
				</div>
		]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">14873</post-id>	</item>
		<item>
		<title>MongoDB ㄧ Replica Set 建立方法</title>
		<link>https://www.omniwaresoft.com.tw/techcolumn/mongodb-techcolumn/mongodb-create-replica-set/</link>
		
		<dc:creator><![CDATA[Omni]]></dc:creator>
		<pubDate>Thu, 01 Feb 2018 08:49:05 +0000</pubDate>
				<category><![CDATA[MongoDB 技術專欄]]></category>
		<category><![CDATA[技術專欄]]></category>
		<category><![CDATA[MongoDB]]></category>
		<guid isPermaLink="false">https://goodpoint-studio.com/?p=12934</guid>

					<description><![CDATA[高可用的必要性  NoSQL 大都有一項...]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="12934" class="elementor elementor-12934" data-elementor-post-type="post">
						<section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-top-section elementor-element elementor-element-167d8594 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="167d8594" data-element_type="section">
						<div class="elementor-container elementor-column-gap-thegem"><div class="elementor-row">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f9d0341" data-id="f9d0341" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-20792e9b flex-horizontal-align-default flex-horizontal-align-tablet-default flex-horizontal-align-mobile-default flex-vertical-align-default flex-vertical-align-tablet-default flex-vertical-align-mobile-default elementor-widget elementor-widget-text-editor" data-id="20792e9b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
												<div class="elementor-text-editor elementor-clearfix">
						<p></p>
<h2 class="wp-block-heading"><strong>高可用的必要性 </strong></h2>
<p></p>
<p></p>
<p>NoSQL 大都有一項蠻特別的特性，被稱為「 高可用 High Availability 」。</p>
<p>何謂高可用？簡單來說，就是一種讓服務（幾乎）永遠不會下線的能力。</p>
<p>文字討論是很簡單，但讓一個服務永不下線，背後存在許多問題。舉例來説：</p>
<p></p>
<p></p>
<p></p>
<p></p>
<ul class="wp-block-list">
<li>伺服器會壞，壞了怎麼辦？</li>
<li>機房意外停電怎麼辦？</li>
<li>硬碟用久會損毀。就算有備份，也需要復原時間。</li>
<li>機器會需要定時更新換代，以便追上新一代電腦的規格。比方說硬碟空間可能不足，需要換成更大顆的。</li>
<li>軟體需要升級。</li>
</ul>
<p></p>
<p></p>
<p></p>
<p></p>
<p>總之，不管原因為何，我們幾乎總是會碰到停機，這怎樣也避不開。</p>
<p></p>
<p></p>
<p></p>
<p></p>
<h2 class="wp-block-heading"><strong>高可用的解方</strong></h2>
<p></p>
<p></p>
<p>為了一勞永逸地解決所有問題，各家提出的終極方案，大都集中在線上備份之上。</p>
<p></p>
<p></p>
<ul class="wp-block-list">
<li>首先搞來多台機器，讓他們插電上線</li>
<li>所有資料都複製成數份副本，分散在不同的機器裡，並且隨時保持備份被更新到最新狀態</li>
<li>這些機器全都同時開機，掛在線上</li>
<li>如果一台機器掛了，就向其他機器討要備份</li>
</ul>
<p></p>
<p></p>
<p>之所以說是「 終極方案 」的原因，除了它確實能解決問題之外，還因為它很貴。</p>
<p>顯然，為了滿足隨時最少有一份副本可用的高可用性，用戶必須要準備至少 2n 台甚至更多的機器，而且還得讓他們隨時上線燒電，佔用數以倍計的硬碟空間。</p>
<p></p>
<p></p>
<p></p>
<p></p>
<h2 class="wp-block-heading"><strong>MongoDB </strong><strong>的 </strong><strong>Replica Set</strong></h2>
<p></p>
<p></p>
<p>MongoDB 是 NoSQL 的一種，它也有提供這種高可用性架構。這在 MongoDB 的術語中被稱為 &#8220;Replica Set&#8221;。</p>
<p>老實說在更早期，MongoDB 還有一種叫作 Master Slave 的架構，不過那種作法已經過時。讀文件時讀到可以不用理它。<br />以下講講如何在 Linux 機器上起 Replica Set。</p>
<p></p>
<p></p>
<p>因為是測試用途，所以以下直接起在單台機器上。實際上 Replica Set 的多個服務，當然應該要起在不同的系統上面。</p>
<p></p>
<p></p>
<h2 class="wp-block-heading"><strong>起服務 </strong><strong>x3</strong></h2>
<p></p>
<p></p>
<p>mkdir rs01 -p<br />mongod &#8211;replSet &#8220;rs0&#8221; &#8211;dbpath &#8220;rs01&#8221; &#8211;port 27021 &#8211;smallfiles &#8211;fork &#8211;logpath rs01/log.txt<br />mkdir rs02 -p<br />mongod &#8211;replSet &#8220;rs0&#8221; &#8211;dbpath &#8220;rs02&#8221; &#8211;port 27022 &#8211;smallfiles &#8211;fork &#8211;logpath rs01/log.txt<br />mkdir rs03 -p<br />mongod &#8211;replSet &#8220;rs0&#8221; &#8211;dbpath &#8220;rs03&#8221; &#8211;port 27023 &#8211;smallfiles &#8211;fork &#8211;logpath rs01/log.txt</p>
<p>注意關鍵參數是 &#8211;replSet，想要納入同一個 Replica Set 的服務，這個參數必須保持一致。</p>
<p>其他參數與 Replica Set 無關，隨意就好。</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>登入</strong><br />接下來隨意登入一台服務。<br />mongo localhost:27021</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>在 Mongo Shell 中進行初始化</strong><br />然後在 Mongo Shell 中輸入以下指令，進行 Replica Set 的初始化：<br />rs.initiate()</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p>其實這一步可以直接輸入參數，一次到位，不過參數長長一大串怎樣都背不起來，所以不輸入讓它自行產生，之後再修改。小規模佈署時這樣比較方便。</p>
<p></p>
<p></p>
<p></p>
<p></p>
<figure class="wp-block-image size-full"><img loading="lazy" width="654" height="274" data-recalc-dims="1" class="wp-image-31623" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/image-4.png?w=1170&#038;ssl=1" alt="MongoDB Code" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/image-4.png?w=654&amp;ssl=1 654w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/image-4.png?resize=300%2C126&amp;ssl=1 300w" sizes="(max-width: 654px) 100vw, 654px" />▲ 初始化前沒有任何訊息。</figure>
<p></p>
<p></p>
<p></p>
<p></p>
<figure class="wp-block-image size-full"><img loading="lazy" width="668" height="432" data-recalc-dims="1" class="wp-image-31624" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/image-5.png?w=1170&#038;ssl=1" alt="MongoDB Code" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/image-5.png?w=668&amp;ssl=1 668w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/image-5.png?resize=300%2C194&amp;ssl=1 300w" sizes="(max-width: 668px) 100vw, 668px" />▲ 初始化後的狀況，目前有一個節點。當然那就是自己。</figure>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p>注意上圖中 name 的地方，這也是 Replica Set 彼此的連線網路位置。</p>
<p>然後使用 rs.add() 加入其他機器。<br />rs.add(&#8220;mongolab:27022&#8221;)<br />rs.add(&#8220;mongolab:27023&#8221;)</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p>如此就佈署完成了。相當簡單。有興趣的話可以故意 kill 掉一個服務，看看系統的處理狀況。</p>
<p>特註：</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p>上方指令中，我的機器名字叫 mongolab，您得改成您的機器名字。</p>
<p>用 localhost 或 127.0.0.1 是行不通的。因為 Replica Set 只有分散佈署在多台不同的機器上時才有實際意義，所以他會判斷，一名用戶如果寫了 localhost 或 127.0.0.1 就是搞錯了狀況，應該要禁止執行。</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p>除此之外，所有機器當然也都要能存取彼此。網路要通 Replica Set 才能順利建立。如果是指定 hostname 而非 ip 的狀況，每台機器也得能解譯全部的 hostnames 才行。</p>
<p></p>
<p></p>
<figure class="wp-block-image size-full"><img loading="lazy" width="721" height="305" data-recalc-dims="1" class="wp-image-31625" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/image-6.png?w=1170&#038;ssl=1" alt="MongoDB Code" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/image-6.png?w=721&amp;ssl=1 721w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/07/image-6.png?resize=300%2C127&amp;ssl=1 300w" sizes="(max-width: 721px) 100vw, 721px" /></figure>
<figure class="wp-block-image size-full">▲ 企圖用 localhost 闖關是行不通的。</figure>
<p></p>
<p></p>
<p>想了解更多資訊，<a href="https://www.omniwaresoft.com.tw/contact/" target="_blank" rel="noreferrer noopener">歡迎聯絡我們</a>，或是<a href="https://page.line.me/870pcqyh?oat__id=4761625&amp;openQrModal=true" target="_blank" rel="noreferrer noopener">加入歐立威 Line 好友！</a></p>
<p></p>							</div>
										</div>
				</div>
					</div>
		</div>
					</div></div>
		</section>
				</div>
		]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">12934</post-id>	</item>
	</channel>
</rss>
