Różnice w zachowaniu

Na tej stronie opisano różnice w działaniu między Cloud Firestore i MongoDB.

Zestawienie obsługiwanych funkcji w zależności od wersji MongoDB znajdziesz w tych artykułach:

Połączenia i bazy danych

  • Każde połączenie jest ograniczone do jednej bazy danych Cloud Firestore.
  • Przed połączeniem się z bazą danych należy ją utworzyć.

Nazwa

Poniższe różnice dotyczą nazewnictwa części modelu danych.

Kolekcje

  • Nazwy kolekcji pasujące do __.*__ nie są obsługiwane.

Pola

  • Nazwy pól pasujące do __.*__ nie są obsługiwane.
  • Puste nazwy pól nie są obsługiwane.

Dokumenty

  • Maksymalny rozmiar dokumentu to 16 MiB.
  • Maksymalna głębokość zagnieżdżenia pól to 20. Każde pole typu tablica i obiekt dodaje 1 poziom do ogólnej głębokości.
  • W zdarzeniach Eventarc dokumenty o rozmiarze większym niż 10 MiB nie są uwzględniane w ładunku zdarzenia.

_id pole

  • Pole _id najwyższego poziomu musi być typu ObjectId, String, 64-bit integer, 32-bit integer, Double, Binary lub Object. Inne typy BSON nie są obsługiwane.

Wartości

  • Typy BSON JavaScript, Symbol, DBPointer i Undefined nie są obsługiwane.

Data

  • Wartości daty muszą mieścić się w zakresie [0001-01-01T00:00:00Z, 9999-12-31T23:59:59Z].

Decimal128

  • Wartości NaN, dodatnia nieskończoność i ujemna nieskończoność są kanonizowane podczas zapisu.
  • Operacje arytmetyczne na Decimal128 nie są obsługiwane.

Liczba zmiennoprzecinkowa

  • Wartości NaN są przekształcane do postaci kanonicznej podczas zapisu.

Wyrażenie regularne

  • Opcje wyrażeń regularnych muszą być prawidłowe („i”, „m”, „s”, „u” lub „x”) i podane w porządku alfabetycznym bez powtórzeń.

Zapytania

  • Naturalna kolejność sortowania (zapytania bez wyraźnego sortowania) nie pasuje do kolejności wstawiania ani do kolejności według _id rosnąco.

Agregacje

  • Agregacje są ograniczone do 250 etapów.
  • Etapy $merge i $out nie są obsługiwane. Pełną listę obsługiwanych etapów i operatorów znajdziesz w sekcji poleceń.
  • Etap $facet nie obsługuje $rand ani $sample na etapach wejściowych, ponieważ jest to wyrażenie nietrwałe.

Zapisy

  • Dokumentów o nazwach zaczynających się od znaku dolara („$”) nie można tworzyć za pomocą funkcji upsert w update ani findAndModify.
  • Upewnij się, że ciąg znaków połączenia zawiera retryWrites=false (lub użyj metody odpowiedniej dla Twojego sterownika), aby sterownik nie próbował używać tej funkcji. Zapisy z możliwością ponowienia nie są obsługiwane.

Transakcje

  • Obsługiwane są izolacja zrzutu i transakcje z możliwością serializacji.

  • Domyślnie transakcje używają optymistycznej kontroli równoczesności z izolacją zrzutu.

Odczytywanie zgłoszenia

  • Cloud Firestore obsługuje ustawienia odczytu snapshot, majority i linearizable. Wartość domyślna to snapshot, co oznacza izolację zrzutu.

    Używaj linearizable, gdy aplikacja wymaga ścisłej spójności i musi zapobiegać anomaliom związanym z asymetrią zapisu. W przypadku innych zadań snapshot może poprawić wydajność i zmniejszyć rywalizację o transakcje.

Zgłoś problem

  • Obsługiwane są tylko ustawienia zapisu w: 'majority' i w: 1.

Sposób odczytu

  • Obsługiwane są tylko te ustawienia read concern: primary, primaryPreferred, primary_preferred, secondary_preferred i nearest.

Indeksy

  • Indeksy wieloznaczne nie są obsługiwane.
  • Cloud Firestore nie tworzy automatycznie indeksu w _id, ale zapewnia, że wartości _id są unikalne w kolekcji. Aby uzyskać podobne działanie sortowania, musisz wyraźnie utworzyć uporządkowany indeks w polu _id. Pamiętaj jednak o potencjalnych problemach z punktami krytycznymi, zwłaszcza jeśli wartości _id rosną lub maleją monotonicznie (np. sygnatury czasowe), ponieważ może to mieć wpływ na wydajność na dużą skalę.
  • Indeksy bez włączonej opcji wielu kluczy nie są automatycznie zmieniane na indeksy z wieloma kluczami na podstawie operacji zapisu. Podczas tworzenia indeksu musisz włączyć obsługę wielu kluczy. Tej opcji nie można zmienić.

Błędy

  • Kody błędów i komunikaty o błędach mogą się różnić w przypadku Cloud Firestore i MongoDB.

Polecenia

Poniższe różnice w działaniu dotyczą konkretnych poleceń.

  • Polecenia, których nie ma w tych tabelach, nie są obsługiwane.
  • comment jest akceptowany przez większość poleceń, ale jest ignorowany.
  • maxTimeMS jest akceptowany przez większość poleceń, ale może być ignorowany.

Zapytania

i zapisy

Command Nieobsługiwane pola

find

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

aggregate

  • collation
  • let

insert

(brak)

update

W instrukcji aktualizacji:

  • collation

delete

W instrukcji usuwania:

  • collation

findAndModify

  • collation
  • let

count

  • collation

distinct

  • collation

getMore

  • comment

killCursors

(brak)

explain

(brak)

Transakcje

i sesje

Command Nieobsługiwane pola

commitTransaction

(brak)

abortTransaction

(brak)

endSessions

(brak)

Administracja

Command Nieobsługiwane pola Notes

listDatabases

  • authorizedDatabases
Jeśli podano parametr filter, musi on być pusty.

listCollections

(brak)

Jeśli podano parametr authorizedCollections, musi on mieć wartość „fałsz”.

listIndexes

(brak)

createIndexes

(brak)

dropIndexes

(brak)

createCollection

  • timeseries
  • expireAfterSeconds
  • clusteredIndex
  • changeStreamPreAndPostImages
  • size
  • max
  • storageEngine
  • validator
  • validationLevel
  • validationAction
  • indexOptionDefaults
  • viewOn
  • pipeline
  • collation
  • encryptedFields
To polecenie nie wykonuje żadnej operacji.

Jeśli podano parametr capped, musi on mieć wartość false.

drop

(brak)

Ograniczenia dotyczące usuwania kolekcji

Podczas usuwania kolekcji obowiązują te ograniczenia:

  • Ponowne tworzenie indeksu: nie możesz utworzyć tej samej konfiguracji indeksu bezpośrednio po usunięciu. Musisz poczekać na zakończenie usuwania w tle.
  • Limit rozmiaru: usuwanie dużych kolekcji może powodować przekroczenie limitu czasu połączenia. Jeśli występują przekroczenia limitu czasu, wydłuż czas oczekiwania na połączenie. Zamiast tego możesz użyć usuwania zbiorczego.
  • Zdarzenia: zdarzenia zbierania danych nie są generowane dla Eventarc, gdy używasz polecenia drop.

Co dalej?