<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Mongodb-Api on Tarragon</title><link>https://tarrragon.github.io/blog/tags/mongodb-api/</link><description>Recent content in Mongodb-Api on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Wed, 27 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/mongodb-api/index.xml" rel="self" type="application/rss+xml"/><item><title>Cosmos DB MongoDB API vs SQL API：遷移路徑、dogfood signal、multi-model、跨雲 hedging</title><link>https://tarrragon.github.io/blog/backend/01-database/vendors/cosmosdb/mongodb-api-vs-sql-api/</link><pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/01-database/vendors/cosmosdb/mongodb-api-vs-sql-api/</guid><description>&lt;p>Cosmos DB 提供 &lt;em>5 個 API&lt;/em>（SQL / MongoDB / Cassandra / Gremlin / Table）、底層是同一個分散式 document store。團隊從 MongoDB 來、第一個問題通常是「MongoDB API 跟 native SQL API 我選哪個」 — 但這個問題框架太窄。讀者真正在比的是 &lt;em>vendor selection&lt;/em>、不是兩個 API 的 syntax 差。本文把選型推到四層問題：(a) 你的遷移路徑屬於哪一型、(b) dogfood signal 怎麼讀、(c) multi-model 差異化是否真用上、(d) 跨雲 hedging 還是單雲 lock-in。先把四層 framing 講清楚、再進兩個 API 的機制差異、最後給 MongoDB → Cosmos DB MongoDB API 的 migration playbook。&lt;/p>
&lt;p>本文不是 Cosmos DB overview（請看 &lt;a href="https://tarrragon.github.io/blog/backend/01-database/vendors/cosmosdb/" data-link-title="Azure Cosmos DB" data-link-desc="全球分散式 multi-model DB、5 個 consistency levels、Microsoft 自家 dogfood 證據">Cosmos DB vendor 頁&lt;/a>）— 而是 &lt;em>選型決策 + 遷移實作&lt;/em> 的深度展開。Case anchor 是 &lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/microsoft-365-cosmos-db-analytics/" data-link-title="9.C30 Microsoft 365：從 MongoDB 遷移到 Cosmos DB 的分析平台" data-link-desc="Microsoft 365 把使用分析平台從 MongoDB 遷移到 Cosmos DB、planet-scale 全球分散式分析">9.C30 Microsoft 365&lt;/a> — Microsoft 自家 dogfood、MongoDB → Cosmos DB MongoDB API 的 planet-scale 分析平台、提供四層 framing 的證據錨點。&lt;/p>
&lt;h2 id="問題情境選型問題不是兩個-api-哪個快">問題情境：選型問題不是「兩個 API 哪個快」&lt;/h2>
&lt;p>典型觸發場景：團隊已用 MongoDB（自管 或 Atlas）、評估遷到 Azure；Cosmos DB 提供 MongoDB API（wire protocol 相容）跟 native SQL API 兩條路；文件講「MongoDB API 是 wire compat、SQL API 是 native」、但這個敘述沒回答真實決策問題。&lt;/p>
&lt;p>讀者實際在問：&lt;/p>
&lt;ul>
&lt;li>「MongoDB API 我們的 aggregation pipeline 跑得起來嗎」&lt;/li>
&lt;li>「&lt;code>$lookup&lt;/code> 在 Cosmos DB MongoDB API 支援嗎」&lt;/li>
&lt;li>「change stream 跟 Change Feed 是同一回事嗎」&lt;/li>
&lt;li>「為什麼有人說 MongoDB API 只是過渡、最終要遷 SQL API」&lt;/li>
&lt;li>「Microsoft 自己選了 MongoDB API、是不是代表 MongoDB API 才是對的選擇」&lt;/li>
&lt;/ul>
&lt;p>這些問題背後的 &lt;em>真實壓力&lt;/em> 是 vendor selection：團隊已選 Azure、要決定「留 Atlas 還是進 Cosmos DB、進了 Cosmos DB 用哪個 API」、選錯的成本是 &lt;em>年級的工程遷移&lt;/em> — 不是 &lt;em>config 改不改&lt;/em> 等級。Microsoft 365 案例（&lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/microsoft-365-cosmos-db-analytics/" data-link-title="9.C30 Microsoft 365：從 MongoDB 遷移到 Cosmos DB 的分析平台" data-link-desc="Microsoft 365 把使用分析平台從 MongoDB 遷移到 Cosmos DB、planet-scale 全球分散式分析">9.C30&lt;/a>）從 MongoDB 遷到 Cosmos DB MongoDB API 是 dogfood、但 case 自承「沒有提具體 throughput、latency、cost 數字」— 引用時不能拿這個案例的「成功」當 benchmark、只能取它的 framing。&lt;/p></description><content:encoded><![CDATA[<p>Cosmos DB 提供 <em>5 個 API</em>（SQL / MongoDB / Cassandra / Gremlin / Table）、底層是同一個分散式 document store。團隊從 MongoDB 來、第一個問題通常是「MongoDB API 跟 native SQL API 我選哪個」 — 但這個問題框架太窄。讀者真正在比的是 <em>vendor selection</em>、不是兩個 API 的 syntax 差。本文把選型推到四層問題：(a) 你的遷移路徑屬於哪一型、(b) dogfood signal 怎麼讀、(c) multi-model 差異化是否真用上、(d) 跨雲 hedging 還是單雲 lock-in。先把四層 framing 講清楚、再進兩個 API 的機制差異、最後給 MongoDB → Cosmos DB MongoDB API 的 migration playbook。</p>
<p>本文不是 Cosmos DB overview（請看 <a href="/blog/backend/01-database/vendors/cosmosdb/" data-link-title="Azure Cosmos DB" data-link-desc="全球分散式 multi-model DB、5 個 consistency levels、Microsoft 自家 dogfood 證據">Cosmos DB vendor 頁</a>）— 而是 <em>選型決策 + 遷移實作</em> 的深度展開。Case anchor 是 <a href="/blog/backend/09-performance-capacity/cases/microsoft-365-cosmos-db-analytics/" data-link-title="9.C30 Microsoft 365：從 MongoDB 遷移到 Cosmos DB 的分析平台" data-link-desc="Microsoft 365 把使用分析平台從 MongoDB 遷移到 Cosmos DB、planet-scale 全球分散式分析">9.C30 Microsoft 365</a> — Microsoft 自家 dogfood、MongoDB → Cosmos DB MongoDB API 的 planet-scale 分析平台、提供四層 framing 的證據錨點。</p>
<h2 id="問題情境選型問題不是兩個-api-哪個快">問題情境：選型問題不是「兩個 API 哪個快」</h2>
<p>典型觸發場景：團隊已用 MongoDB（自管 或 Atlas）、評估遷到 Azure；Cosmos DB 提供 MongoDB API（wire protocol 相容）跟 native SQL API 兩條路；文件講「MongoDB API 是 wire compat、SQL API 是 native」、但這個敘述沒回答真實決策問題。</p>
<p>讀者實際在問：</p>
<ul>
<li>「MongoDB API 我們的 aggregation pipeline 跑得起來嗎」</li>
<li>「<code>$lookup</code> 在 Cosmos DB MongoDB API 支援嗎」</li>
<li>「change stream 跟 Change Feed 是同一回事嗎」</li>
<li>「為什麼有人說 MongoDB API 只是過渡、最終要遷 SQL API」</li>
<li>「Microsoft 自己選了 MongoDB API、是不是代表 MongoDB API 才是對的選擇」</li>
</ul>
<p>這些問題背後的 <em>真實壓力</em> 是 vendor selection：團隊已選 Azure、要決定「留 Atlas 還是進 Cosmos DB、進了 Cosmos DB 用哪個 API」、選錯的成本是 <em>年級的工程遷移</em> — 不是 <em>config 改不改</em> 等級。Microsoft 365 案例（<a href="/blog/backend/09-performance-capacity/cases/microsoft-365-cosmos-db-analytics/" data-link-title="9.C30 Microsoft 365：從 MongoDB 遷移到 Cosmos DB 的分析平台" data-link-desc="Microsoft 365 把使用分析平台從 MongoDB 遷移到 Cosmos DB、planet-scale 全球分散式分析">9.C30</a>）從 MongoDB 遷到 Cosmos DB MongoDB API 是 dogfood、但 case 自承「沒有提具體 throughput、latency、cost 數字」— 引用時不能拿這個案例的「成功」當 benchmark、只能取它的 framing。</p>
<h2 id="四層-framingvendor-selection-的真實決策軸">四層 framing：vendor selection 的真實決策軸</h2>
<h3 id="framing-1document-model-三型遷移路徑對照本章合成-frame">Framing 1：document model 三型遷移路徑對照（本章合成 frame）</h3>
<p>「MongoDB → Cosmos DB」是 <em>一種</em> 遷移、不是 <em>全部</em> 遷移。document model 的遷移路徑在 case 庫至少呈現三型、風險跟 ROI 完全不同：</p>
<table>
  <thead>
      <tr>
          <th>遷移型</th>
          <th>案例</th>
          <th>工程複雜度</th>
          <th>ROI</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>保留 + 補周邊</td>
          <td><a href="/blog/backend/09-performance-capacity/cases/coinbase-mongodb-document-platform/" data-link-title="9.C36 Coinbase：MongoDB 撐 Ruby 單體 &#43; 1.5M reads/sec identity 服務" data-link-desc="Coinbase 以 MongoDB 為主資料層、自建 mongobetween connection proxy、users 服務在加密貨幣 surge 時撐 1.5M reads/sec">9.C36 Coinbase</a>（mongobetween + freshness token + ML predictive scaling）</td>
          <td>低、漸進、保留 MongoDB 自管</td>
          <td>中、解 connection storm 等瓶頸</td>
      </tr>
      <tr>
          <td>同 DB 換託管</td>
          <td><a href="/blog/backend/09-performance-capacity/cases/forbes-mongodb-atlas-multi-cloud-migration/" data-link-title="9.C37 Forbes：自管 MongoDB → Atlas on GCP、build 時間 25 → 9 分鐘" data-link-desc="Forbes 把自管 MongoDB 遷到 Atlas on Google Cloud、6 個月完成、build 25 → 9 分鐘、120M 不重複訪客單月承接">9.C37 Forbes</a>（自管 → Atlas、6 個月）</td>
          <td>中、schema 跟 access pattern 保留</td>
          <td>高、釋放 ops 人力</td>
      </tr>
      <tr>
          <td>同 model 換 vendor</td>
          <td><a href="/blog/backend/09-performance-capacity/cases/microsoft-365-cosmos-db-analytics/" data-link-title="9.C30 Microsoft 365：從 MongoDB 遷移到 Cosmos DB 的分析平台" data-link-desc="Microsoft 365 把使用分析平台從 MongoDB 遷移到 Cosmos DB、planet-scale 全球分散式分析">9.C30 Microsoft 365</a>（MongoDB → Cosmos DB MongoDB API）</td>
          <td>高、底層架構換、driver 保留</td>
          <td>高、planet-scale 擴展性</td>
      </tr>
  </tbody>
</table>
<p><strong>三型 frame 是本章合成、case 原文沒有此分類</strong>。引用時要明示：Forbes 6 個月遷移成功 <em>不代表</em> Microsoft 365 也是 6 個月、底層架構換的工程複雜度遠高於託管換。讀者開頭要先問「我屬於哪一型」、再進兩個 API 比較 — 「保留 + 補周邊」根本不需要進 Cosmos DB selection、「同 DB 換託管」的主要 trade-off 是 Atlas vs Cosmos DB 跨雲問題（Framing 4）、「同 model 換 vendor」才是本文聚焦的決策。</p>
<p>把三型混淆的後果是：拿 Forbes 6 個月時程當 baseline 估 Microsoft 365 型遷移、實際工程複雜度高 3-5 倍、project plan 從第一天就 over-commit。</p>
<h3 id="framing-2dogfood-是高權重-selection-signal但案例數字常不公開">Framing 2：dogfood 是高權重 selection signal、但案例數字常不公開</h3>
<p>Microsoft 365 案例揭露的核心 signal 是「Microsoft 自家旗艦產品 dogfood Cosmos DB」— 跟 Amazon Prime Day 用 DynamoDB、Google 自家用 Spanner 一樣、雲商旗艦 DB 都用在自家旗艦產品上、這個 signal 在 vendor selection 的權重高、因為「雲商自己賭身家」。讀者該把這當 <em>選型訊號</em>、不是當 <em>production benchmark</em>。</p>
<p>但 9.C30 case 自承的警示必須明示：</p>
<ul>
<li>「沒有提具體 throughput、latency、cost 數字。Microsoft 內部數字通常不公開、跟 AWS / GCP 案例的數字密度差很多」</li>
<li>「『MongoDB 不夠用』是行銷話術。實際是 <em>MongoDB 在某些 workload pattern 下不夠用</em>、不是普遍結論」</li>
</ul>
<p>兩條警示直接影響寫作紀律：</p>
<ul>
<li>不能拿「Microsoft 365 遷成功」當「我們也會成功」的證據 — 規模 / workload pattern / 團隊能力都不同</li>
<li>不能拿「Microsoft 從 MongoDB 遷出」當「MongoDB 不行」的結論 — Microsoft 自己也有大量 MongoDB / Cosmos DB / SQL Server 並用、不是全部遷出</li>
</ul>
<p>dogfood signal 的 <em>正確用法</em> 是當 frame 借鑑（multi-model 差異化、planet-scale 抽象單位、API compatibility 層）、不是當數字 benchmark。</p>
<h3 id="framing-3multi-model-是-cosmos-db-的差異化價值不總是真用上">Framing 3：multi-model 是 Cosmos DB 的差異化價值、不總是真用上</h3>
<p>Cosmos DB 的差異化價值不是「比 Atlas 更會跑 MongoDB」、是 <em>單一服務支援 5 個 API</em>（SQL / MongoDB / Cassandra / Gremlin / Table）。跨雲對照揭露這個差異化的稀有度：</p>
<ul>
<li>AWS：DynamoDB（KV）+ DocumentDB（MongoDB-compatible）+ Neptune（graph）+ Keyspaces（Cassandra）— 各 use case 一個產品</li>
<li>GCP：Firestore（document）+ Bigtable（KV）+ Spanner（SQL）— 各 use case 一個產品</li>
<li>Azure Cosmos DB：5 個 API 在 <em>同一個服務</em> 內、partition + RU + region 治理共用</li>
</ul>
<p>對 selection 的意義：若團隊預期同一系統會用 document + KV + graph 混合、Cosmos DB 的 multi-model 是 <em>運維單一服務</em> 的 unique value、不是只看「MongoDB 替代品」就能 ROI 評估。但 anti-pattern 也明確：<em>若團隊只用 MongoDB API、不會用其他 4 個 API</em>、multi-model 差異化價值對該團隊 <em>不成立</em>、不該變成 selection 理由。</p>
<p>判讀時要把 multi-model 當「條件性價值」、不是「普遍優勢」 — 條件是「現在或可預見未來會用到第二個 API」。9.C30 Microsoft 365 case 策略段直接揭露「Multi-model 是 Cosmos DB 的差異化價值」、但這個價值對「只用 MongoDB API」的團隊不成立、不能套到所有讀者。</p>
<h3 id="framing-4跨雲-hedging-vs-單雲-lock-in-的-trade-off">Framing 4：跨雲 hedging vs 單雲 lock-in 的 trade-off</h3>
<p>選 Cosmos DB（單雲、Azure-only）跟選 MongoDB Atlas（跨雲、AWS / GCP / Azure 都能跑）的核心 trade-off 不是「哪個技術更強」、是 <em>未來不確定性的對沖價值</em> — 對應 <a href="/blog/backend/knowledge-cards/vendor-lock-in/" data-link-title="Vendor Lock-In" data-link-desc="說明採用供應商產品後，其 API 與格式滲入程式碼造成的退出成本">vendor lock-in</a> 的退出成本評估：</p>
<ul>
<li>Atlas：跨雲部署能力、未來換雲商不用換 DB、9.C37 Forbes 用 GCP 但保留跨雲彈性</li>
<li>Cosmos DB / DynamoDB / Spanner：三大雲商各自的單雲 DB、選一個就綁該雲商生態</li>
</ul>
<p>對 <em>未來雲商策略尚未底定</em> 的團隊、Atlas 的 hedging 價值 <em>高</em>、即使當下單雲就夠用 — 因為 5 年後換雲商的工程成本可能遠高於每月多付的 hosting 費用。對 <em>已綁 Azure 生態</em> 的團隊（Microsoft 365 dogfood、企業 AAD / Office / Power Platform 整合）、Cosmos DB 的 Azure-only 是 <em>整合延伸</em>、不是 <em>lock-in 損失</em> — 雲商已綁、再加一個 lock-in 不增邊際成本。</p>
<p>引用時必須明示這是 <em>未來不確定性 vs 當下整合</em> 的 hedging trade-off、不是「跨雲一定比較好」。讀者該問自己：「我們未來 5 年雲商策略是已定還是未定」、答案會直接決定 Atlas vs Cosmos DB 的選擇方向。</p>
<h2 id="兩個-api-的機制差異">兩個 API 的機制差異</h2>
<p>四層 framing 講完、再進 API 機制 — 不是為了「哪個快」、是為了讓 selection 後的實作不踩坑。</p>
<p>兩個 API 的關係：底層是同一個 Cosmos DB 分散式 document store、API layer 翻譯不同 wire protocol。MongoDB API 把 MongoDB 操作翻譯成 Cosmos DB internal、實際跑 Cosmos DB 自身 engine、不執行 MongoDB engine；SQL API 直接操作 Cosmos DB native query language。</p>
<p><strong>MongoDB API</strong>：</p>
<ul>
<li>相容 MongoDB wire protocol（時間敏感 claim、查 <a href="https://learn.microsoft.com/azure/cosmos-db/mongodb/feature-support-60">最新支援版本</a>、目前對齊 6.0 / 7.0 但仍落後 native MongoDB）</li>
<li>Driver 不變：直接用 mongo-go-driver / pymongo / mongoose</li>
<li>翻譯層有 overhead、相同 query 的 <a href="/blog/backend/knowledge-cards/request-unit/" data-link-title="Request Unit" data-link-desc="Cosmos DB 的容量抽象單位、1 RU = 1KB document strong-consistent read 的 CPU &#43; memory &#43; IOPS 綜合 cost、寫 ~5 RU、複雜 query 數百 RU">Request Unit</a> 通常比 SQL API 多 10-20%（屬通用工程估算、Microsoft 公開文件未列具體比例、case 也未直接量化、實際 overhead 依 query shape / driver 版本 / region 而異、應該以自家 workload benchmark 校正）</li>
</ul>
<p><strong>SQL API</strong>：</p>
<ul>
<li>Cosmos DB native query language（SQL-like、不是標準 SQL、不支援 JOIN）</li>
<li>直接操作 JSON document、ARRAY / nested field native 支援</li>
<li>完整 Cosmos DB feature 支援（Change Feed、stored procedure、trigger）</li>
</ul>
<p><strong>關鍵差異點</strong>：</p>
<ul>
<li><code>$lookup</code>（join）：MongoDB API 支援度有限、跨 partition 性能差；SQL API 沒 JOIN（document model 哲學）</li>
<li>Aggregation pipeline：部分 stage 不支援或行為不同（時間敏感、查 <a href="https://learn.microsoft.com/azure/cosmos-db/mongodb/feature-support-60#aggregation-pipeline">支援列表</a>）</li>
<li>Index：MongoDB API hint / explain 行為跟 native MongoDB 不同</li>
<li>Change stream：MongoDB API 提供 change stream wire compat、但底層是 Cosmos DB Change Feed（語義 / ordering / retention 有差）</li>
<li>Transaction：兩邊都限同 partition、跨 partition transaction 都要改 workflow</li>
</ul>
<p>API kind 是 <em>account 層設定</em>、<em>建 account 時選擇、無法事後切換</em>。MongoDB API → SQL API 的「升級」是 export → recreate account → import + 重寫 application 的全量遷移、不是 in-place 切換。</p>
<h2 id="migration-playbookmongodb--cosmos-db-mongodb-api">Migration playbook：MongoDB → Cosmos DB MongoDB API</h2>
<p>「同 model 換 vendor」型遷移（Framing 1 第三型）的 6 規格面 audit：</p>
<h3 id="規格面-1driver">規格面 1：Driver</h3>
<ul>
<li>主要 driver：Azure 生態整合、需要更好的 global distribution、Atlas 跨雲成本不必要（單雲團隊）</li>
<li>對應 Framing 4 的「已綁 Azure 生態」條件</li>
</ul>
<h3 id="規格面-2no-go-condition">規格面 2：No-go condition</h3>
<ul>
<li>跨雲需求（Framing 4、Atlas 仍是首選、Forbes 案例證據）</li>
<li>需要 native MongoDB latest feature（MongoDB API server version 落後 native MongoDB）</li>
<li>未來雲商策略未定（hedging 價值喪失）</li>
<li>純 MongoDB 投資、無 Azure 生態其他服務整合（Framing 3 multi-model 不成立）</li>
</ul>
<h3 id="規格面-3diff-audit6-維度">規格面 3：Diff audit（6 維度）</h3>
<ul>
<li><strong>Schema</strong>：document shape 不變（wire compat）；但 <code>_id</code> 行為跟 Cosmos DB partition key 綁定方式要審</li>
<li><strong>Operational</strong>：自管 MongoDB → managed Cosmos DB、replica set / sharding 變成 partition + region、備份 / monitoring 全換</li>
<li><strong>Paradigm</strong>：不變（仍 document model）</li>
<li><strong>Components</strong>：MongoDB driver 保留、aggregation pipeline 部分需重寫</li>
<li><strong>Application change</strong>：connection string、authentication mechanism（SCRAM → Azure key / AAD）、read preference 對應 consistency level</li>
<li><strong>Topology</strong>：replica set → multi-region replication、shard key → partition key</li>
</ul>
<p>遷移類型判定：<strong>Type B drop-in（partial）</strong>、wire compat 但有相容性 gap、必須 dual-write per query pattern 驗證、不是一次切換。</p>
<h3 id="規格面-4phase-plan">規格面 4：Phase plan</h3>
<ul>
<li>Phase 0：相容性 audit、列 unsupported aggregation stage、production query corpus 對齊</li>
<li>Phase 1：partition key 設計（從 shard key 翻譯）、見 <a href="../partition-key-design/">partition-key-design</a></li>
<li>Phase 2：bulk export-import（mongodump → Cosmos DB Data Migration Tool）</li>
<li>Phase 3：CDC sync（MongoDB oplog → Azure Data Factory / 自寫 connector）</li>
<li>Phase 4：shadow read 驗證 query 一致性、量 RU consumption baseline</li>
<li>Phase 5：read cutover（讀切 Cosmos、寫仍 MongoDB）</li>
<li>Phase 6：write cutover</li>
<li>Phase 7：cleanup、退役 MongoDB cluster、保留 dump 90 天</li>
</ul>
<h3 id="規格面-5evidence">規格面 5：Evidence</h3>
<ul>
<li>query 一致性 diff log、aggregation result checksum、RU consumption baseline、replication lag</li>
<li>對應 <a href="/blog/backend/01-database/schema-migration-rollout-evidence/" data-link-title="1.7 Schema Migration Rollout 證據（Schema Migration Rollout Evidence）實作示範" data-link-desc="以訂單付款狀態欄位演進示範 schema migration 如何產出 evidence、release gate 與 incident decision log。">schema-migration-rollout-evidence</a> 的 dual-write 驗證</li>
</ul>
<h3 id="規格面-6cutover--cleanup">規格面 6：Cutover + cleanup</h3>
<ul>
<li>read-only window &lt; 10 min、aggregation result 對齊驗證</li>
<li>Rollback 條件：query error rate &gt; 1% 或 RU consumption 異常偏高（翻譯層 cost 高於估算）</li>
</ul>
<h2 id="失敗模式">失敗模式</h2>
<h3 id="failure-1假設-wire-compat--100-行為相同">Failure 1：假設 wire compat = 100% 行為相同</h3>
<p>「100% wire compat」是 vendor 行銷話術、實際是「在某些 query pattern 下相容」— aggregation pipeline 跑出不同結果、上 production 才發現。9.C30 case 揭露的「『MongoDB 不夠用』是行銷話術。實際是 <em>MongoDB 在某些 workload pattern 下不夠用</em>」同模型反向適用 — <em>相容性</em> 也是「在某些 query pattern 下相容」、不是普遍相容。</p>
<p>修法：production query corpus dual-write 跑一遍、case-by-case 驗證每個 query pattern、不能假設 wire compat = 行為 100% 一致。Phase 4 shadow read 不是「跑一些 test」、是 <em>把所有 production query 跑一遍、對 checksum</em>。</p>
<h3 id="failure-2_id-當-partition-key">Failure 2：<code>_id</code> 當 partition key</h3>
<p>MongoDB 的 <code>_id</code> 預設 ObjectId、跟 Cosmos DB partition key 邏輯不同；直接拿 <code>_id</code> 當 partition key 容易在 high-cardinality 但低均勻度的 access pattern 下 hot partition（VIP 用戶、機器人帳號）。要審 application 的真實 query pattern、選會均勻散佈的欄位、見 <a href="../partition-key-design/">partition-key-design</a>。</p>
<h3 id="failure-3change-stream-resume-token-跨-api-不可用">Failure 3：Change stream resume token 跨 API 不可用</h3>
<p>MongoDB API 提供 change stream wire compat、但 resume token 格式跟 native MongoDB 不同、跨環境 resume 會失敗。CDC pipeline 在遷移期間需要分兩段：MongoDB 端用原生 resume token、Cosmos DB 端用 Change Feed continuation token、不能 <em>把 token 從 MongoDB 帶到 Cosmos DB 繼續</em>。</p>
<h3 id="failure-4評估時只測-happy-path">Failure 4：評估時只測 happy path</h3>
<p>unsupported aggregation stage 在 dev 環境的 sample data 看不出、production 才爆。常見漏的 stage：<code>$graphLookup</code> / <code>$facet</code> / <code>$bucket</code> / 部分 <code>$lookup</code> pattern / window function。Phase 0 audit 要把 production aggregation pipeline 拉出來、對照 <a href="https://learn.microsoft.com/azure/cosmos-db/mongodb/feature-support-60">Cosmos DB MongoDB API feature support</a> 清單。</p>
<h3 id="failure-5把-dogfood-案例數字當-benchmark">Failure 5：把 dogfood 案例數字當 benchmark</h3>
<p>9.C30 Microsoft 365 case 自承沒提具體 throughput / latency / cost 數字、不能拿 dogfood 案例的「成功」推論「我們團隊遷過去也會成功」— 規模 / workload pattern / 團隊能力都不同。寫 sizing 計畫時要回到 <a href="../ru-cost-model-sizing/">ru-cost-model-sizing</a> 用自己的 query corpus 量、不是抄 dogfood case。</p>
<h3 id="failure-6選-mongodb-api-後想升級-native-mongodb-feature">Failure 6：選 MongoDB API 後想升級 native MongoDB feature</h3>
<p>MongoDB API server version 升級節奏跟 native MongoDB 不同步、新 feature 等待時間長。選 MongoDB API 等於放棄「拿到 native MongoDB 最新 feature」、若團隊 long-term commit Cosmos DB、SQL API 反而是更穩的選擇（feature 自己決定、不等翻譯層）。這條 trade-off 在 selection 階段就要決定、不能 phase 6 才發現。</p>
<h2 id="容量與觀測">容量與觀測</h2>
<ul>
<li>必看 metric：MongoDB API 特有 <code>MongoRequests</code> / <code>MongoRequestCharge</code>、diagnostic log 看 aggregation stage 是否被翻譯成 cross-partition query</li>
<li>容量規劃：MongoDB API 翻譯層有 overhead、相同 query SQL API 通常便宜 10-20% — 但這個差距通常不足以驅動 API 切換（切換成本太高、見 Failure 6）</li>
<li>RU baseline：Phase 4 shadow read 階段量每個 query pattern 的 <code>x-ms-request-charge</code>、進 <a href="../ru-cost-model-sizing/">ru-cost-model-sizing</a> 的 capacity forecast</li>
<li>回 <a href="/blog/backend/09-performance-capacity/capacity-planning/" data-link-title="9.6 容量規劃模型" data-link-desc="peak forecast、headroom budget、growth curve、autoscaling sizing">9.6 容量規劃模型</a>：API kind 選擇進 cost forecast、不是 sizing 後才補</li>
</ul>
<h2 id="cosmos-db-unique-selection-value-整合四層-framing-收束">Cosmos DB unique selection value 整合（四層 framing 收束）</h2>
<p>讀者讀完本篇要能回答：「我該選 Cosmos DB MongoDB API、Cosmos DB SQL API、還是留 Atlas」 — 答案的四層判讀（對應 Framing 1-4）：</p>
<ul>
<li><strong>遷移路徑（Framing 1）</strong>：你是要保留 + 補周邊、換託管、還是換 vendor？三型風險不同、Forbes 時程不代表 Microsoft 365 時程</li>
<li><strong>dogfood signal（Framing 2）</strong>：你能用 frame 借鑑 Microsoft 365、但避免拿 dogfood 數字當 benchmark</li>
<li><strong>multi-model 是否真用上（Framing 3）</strong>：你的系統未來會不會用 graph / Cassandra / Table API？只用一個 API 時 multi-model unique value 不成立</li>
<li><strong>跨雲 hedging vs Azure 整合（Framing 4）</strong>：你的雲商策略是已定還是未定？已綁 Azure 時 lock-in 是整合延伸、未定時 lock-in 是 hedging 損失</li>
</ul>
<p>四層回答完、selection 才能落地、不是「Azure 上要不要用 Cosmos DB」單一問題。</p>
<h2 id="anti-recommendation">Anti-recommendation</h2>
<ul>
<li>純 MongoDB 投資、未來不會綁 Azure、應留在 Atlas — 跨雲彈性的長期價值高於每月 hosting 差價</li>
<li>MongoDB API 是「Azure 上的 MongoDB 替代品」、<em>不是</em> MongoDB 升級版 — 想要 native MongoDB latest feature 應留在 Atlas / 自管 MongoDB</li>
<li>跨雲 hedging 是 selection 主 driver 時、Cosmos DB（單雲）+ DynamoDB（單雲）+ Spanner（單雲）都不該進候選名單</li>
<li>只用 document model、不用其他 4 個 API 時、multi-model 不該變成 selection 理由 — 此時 Atlas managed 服務的 MongoDB 原生行為通常更穩</li>
</ul>
<h2 id="相關連結">相關連結</h2>
<ul>
<li><a href="/blog/backend/01-database/vendors/cosmosdb/" data-link-title="Azure Cosmos DB" data-link-desc="全球分散式 multi-model DB、5 個 consistency levels、Microsoft 自家 dogfood 證據">Cosmos DB vendor overview</a> — 本文是該頁尾「MongoDB API vs native SQL API trade-off」backlog 的深度展開</li>
<li><a href="/blog/backend/09-performance-capacity/cases/microsoft-365-cosmos-db-analytics/" data-link-title="9.C30 Microsoft 365：從 MongoDB 遷移到 Cosmos DB 的分析平台" data-link-desc="Microsoft 365 把使用分析平台從 MongoDB 遷移到 Cosmos DB、planet-scale 全球分散式分析">9.C30 Microsoft 365 dogfood case</a> — 本文主案例、四層 framing 的證據錨點</li>
<li><a href="/blog/backend/09-performance-capacity/cases/coinbase-mongodb-document-platform/" data-link-title="9.C36 Coinbase：MongoDB 撐 Ruby 單體 &#43; 1.5M reads/sec identity 服務" data-link-desc="Coinbase 以 MongoDB 為主資料層、自建 mongobetween connection proxy、users 服務在加密貨幣 surge 時撐 1.5M reads/sec">9.C36 Coinbase</a> — 三型遷移路徑「保留 + 補周邊」對照</li>
<li><a href="/blog/backend/09-performance-capacity/cases/forbes-mongodb-atlas-multi-cloud-migration/" data-link-title="9.C37 Forbes：自管 MongoDB → Atlas on GCP、build 時間 25 → 9 分鐘" data-link-desc="Forbes 把自管 MongoDB 遷到 Atlas on Google Cloud、6 個月完成、build 25 → 9 分鐘、120M 不重複訪客單月承接">9.C37 Forbes</a> — 三型遷移路徑「同 DB 換託管」對照</li>
<li><a href="../partition-key-design/">partition-key-design</a> — Phase 1 partition key 從 shard key 翻譯</li>
<li><a href="../ru-cost-model-sizing/">ru-cost-model-sizing</a> — Phase 4 RU consumption baseline</li>
<li><a href="../consistency-levels-engineering/">consistency-levels-engineering</a> — read preference 對應 consistency level</li>
<li><a href="/blog/backend/01-database/vendors/mongodb/" data-link-title="MongoDB" data-link-desc="Document database 代表、Atlas managed、跨雲可用、許多大規模平台從 MongoDB 起家">MongoDB vendor</a> — Atlas 對照</li>
<li><a href="/blog/backend/01-database/large-scale-db-migration/" data-link-title="1.12 大規模 DB 遷移實戰" data-link-desc="跨 DB 遷移的 dual-write、[shadow read](/backend/knowledge-cards/shadow-read/)、cutover、rollback 流程 — 從實戰案例提煉的工程做法">1.12 大規模 DB 遷移實戰</a> — 跨 vendor 遷移共通模型</li>
<li><a href="/blog/backend/knowledge-cards/database/" data-link-title="Database" data-link-desc="說明 database 在後端系統中如何承擔正式狀態、查詢與一致性責任">Database 卡片</a> / <a href="/blog/backend/knowledge-cards/change-data-capture/" data-link-title="Change Data Capture" data-link-desc="說明資料變更如何被捕捉並傳送到其他系統">Change Data Capture 卡片</a> — 概念基底</li>
<li>官方：<a href="https://learn.microsoft.com/azure/cosmos-db/mongodb/feature-support-60">Cosmos DB MongoDB API feature support</a></li>
</ul>
]]></content:encoded></item></channel></rss>