行為差異

本頁面說明 Cloud Firestore 和 MongoDB 之間的行為差異。

如要依 MongoDB 版本查看支援的功能,請參閱:

連線和資料庫

  • 每個連線只能連結一個 Cloud Firestore 資料庫。
  • 必須先建立資料庫,才能連線。

命名

資料模型各部分的命名差異如下。

珍藏內容

  • 不支援與 __.*__ 相符的集合名稱。

欄位

  • 不支援與 __.*__ 相符的欄位名稱。
  • 欄位名稱不得留空。

文件

  • 文件大小上限為 16 MiB。
  • 欄位的巢狀深度上限為 20。每個陣列和物件類型的欄位都會使整體深度增加一個層級。
  • 在 Eventarc 事件中,事件酬載不包含大於 10 MiB 的文件。

_id 欄位

  • 頂層 _id 欄位必須是 ObjectId、字串、64 位元整數、32 位元整數、雙精度浮點數、二進位檔或物件。不支援其他 BSON 類型。

值

  • 不支援 JavaScript、Symbol、DBPointer 和 Undefined BSON 類型。

日期

  • 日期值必須介於 [0001-01-01T00:00:00Z, 9999-12-31T23:59:59Z]。

Decimal128

  • NaN、正無限大和負無限大值會在寫入時正規化。
  • 不支援對 Decimal128 執行算術運算。

雙人床

  • NaN 值會在寫入時正規化。

規則運算式

  • 規則運算式選項必須有效 (「i」、「m」、「s」、「u」或「x」),並按照字母順序提供,不得重複。

查詢

  • 自然排列順序 (未明確排序的查詢) 與廣告訂單或依 _id 遞增排序不符。

匯總資料

  • 匯總最多只能有 250 個階段。
  • 不支援 $merge 和 $out 階段。如需支援階段和運算子的完整清單,請參閱指令一節。
  • $facet 階段不支援輸入階段中的 $rand 或 $sample,因為這是易失運算式。

寫入

  • 如果文件名稱開頭為美元符號 (「$」),則無法使用 update 或 findAndModify 的 upsert 功能建立。
  • 請確認連線字串包含 retryWrites=false (或使用適合驅動程式的方法),確保驅動程式不會嘗試使用這項功能。不支援可重試寫入。

交易

  • 支援快照隔離和可序列化交易。

  • 根據預設,交易會使用樂觀並行控制和快照隔離。

讀取疑慮資料

  • Cloud Firestore 支援 snapshot、majority 和 linearizable 讀取關注。預設值為 snapshot,代表快照隔離。

    如果應用程式需要嚴格的一致性,且必須防止寫入偏斜異常,請使用 linearizable。對於其他工作負載,snapshot 則可提升效能並減少交易爭用。

寫入疑慮

  • 僅支援 w: 'majority' 和 w: 1 寫入關注。

讀取偏好設定

  • 僅支援 primary、primaryPreferred、primary_preferred、secondary_preferred 和 nearest 讀取關注。

索引

  • 不支援萬用字元索引。
  • Cloud Firestore 不會自動在 _id 上建立索引,但會確保 _id 的值在集合中不重複。如要達到類似的排序行為,您必須在 _id 欄位上明確建立排序索引。不過,請留意潛在的熱點問題,尤其是 _id 值單調遞增或遞減 (例如時間戳記) 時,因為這可能會影響大規模效能。
  • 如果索引未啟用多鍵,系統不會根據寫入作業自動將其變更為多鍵索引。建立索引時必須啟用多重鍵,且無法變更選項。

錯誤

  • Cloud Firestore 和 MongoDB 的錯誤代碼和訊息可能不同。

指令

特定指令的行為差異如下。

  • 不支援下表未列出的指令。
  • 大多數指令都接受 comment,但會忽略。
  • 大多數指令都接受 maxTimeMS,但可能會忽略。

查詢

和寫入

指令 不支援的欄位

find

  • max
  • min
  • returnKey
  • showRecordId
  • tailable
  • oplogReplay
  • noCursorTimeout
  • awaitData
  • allowPartialResults
  • collation
  • allowDiskUsage
  • let

aggregate

  • collation
  • let

insert

(無)

update

在更新陳述式中:

  • collation

delete

在 delete 陳述式中:

  • collation

findAndModify

  • collation
  • let

count

  • collation

distinct

  • collation

getMore

  • comment

killCursors

(無)

explain

(無)

交易

和工作階段

指令 不支援的欄位

commitTransaction

(無)

abortTransaction

(無)

endSessions

(無)

管理

指令 不支援的欄位 附註

listDatabases

  • authorizedDatabases
如果提供 filter,則必須留空。

listCollections

(無)

如有提供,authorizedCollections 必須為 false。

listIndexes

(無)

createIndexes

(無)

dropIndexes

(無)

createCollection

  • timeseries
  • expireAfterSeconds
  • clusteredIndex
  • changeStreamPreAndPostImages
  • size
  • max
  • storageEngine
  • validator
  • validationLevel
  • validationAction
  • indexOptionDefaults
  • viewOn
  • pipeline
  • collation
  • encryptedFields
這個指令是無作業。

如果提供 capped,則必須為 false。

drop

(無)

Drop 集合限制

刪除集合時,請注意下列限制:

  • 重新建立索引:刪除索引後,無法立即建立相同的索引設定。您必須等待背景刪除作業完成。
  • 大小限制:捨棄大型集合可能會導致連線逾時。如果發生逾時,請延長連線期限。您可以改用大量刪除功能。
  • 事件:使用 drop 指令時,系統不會為 Eventarc 產生捨棄收集事件。

後續步驟