È stato pubblicato il rilascio del progetto FerretDB 0.1 (precedentemente MangoDB), che consente di sostituire il database orientato ai documenti MongoDB con PostgreSQL senza modificare il codice delle applicazioni. FerretDB è implementato come server proxy, che traduce le richieste a MangoDB in query SQL a PostgreSQL, consentendo di utilizzare PostgreSQL come effettivo sistema di archiviazione. Il codice è scritto in Go e distribuito con licenza Apache 2.0.
La necessità di migrazione può sorgere a causa del passaggio di MongoDB a una licenza non libera SSPL, che si basa sulla licenza AGPLv3, ma non è aperta, poiché contiene un requisito discriminatorio di fornitura sotto licenza SSPL non solo per il codice dell'applicazione stessa, ma anche per il codice sorgente di tutti i componenti coinvolti nella fornitura del servizio cloud.
FerretDB si rivolge agli utenti che non utilizzano nelle proprie applicazioni le funzionalità avanzate di MongoDB, ma desiderano impiegare un stack software completamente aperto. Nella fase attuale di sviluppo, FerretDB supporta solo una parte delle funzionalità di MongoDB, quelle più comunemente utilizzate nelle applicazioni standard. In futuro, si prevede di raggiungere la piena compatibilità con i driver di MongoDB e di consentire l'uso di FerretDB come sostituto trasparente di MongoDB.
Ricordiamo che MongoDB occupa una nicchia tra i sistemi veloci e scalabili che gestiscono i dati in formato chiave/valore e i database relazionali, funzionali e facili nella formulazione di query. MongoDB supporta la memorizzazione di documenti in un formato simile a JSON, ha un linguaggio abbastanza flessibile per la formulazione di query, può creare indici per vari attributi memorizzati, garantisce efficacemente la memorizzazione di grandi oggetti binari, supporta la registrazione delle operazioni di modifica e aggiunta dei dati nel database, può operare in conformità alla paradigma Map/Reduce, supporta la replicazione e la costruzione di configurazioni resilienti.
Nella versione FerretDB 0.1.0 è stato completamente riprogettato il metodo di estrazione dei dati da PostgreSQL. In precedenza, per ogni richiesta in arrivo da MongoDB veniva generata una singola query SQL a PostgreSQL, utilizzando funzioni per lavorare con il formato JSON ed eseguendo la filtrazione dei risultati sul lato PostgreSQL. A causa delle differenze nella semantica delle funzioni json di PostgreSQL e MongoDB, si osservavano comportamenti non corrispondenti durante il confronto e l'ordinamento di diversi tipi. Per risolvere questo problema, ora PostgreSQL estrae un campionamento eccessivo dei dati, mentre la filtrazione del risultato avviene sul lato FerretDB, il che ha permesso di riprodurre il comportamento di MongoDB nella maggior parte delle situazioni.
Il prezzo dell'aumento della compatibilità è stata una diminuzione delle prestazioni, che nelle future versioni ci si aspetta di compensare mediante un filtraggio selettivo delle richieste sul lato di FerretDB, esclusivamente per quelle in cui si osservano discrepanze nel comportamento. Ad esempio, la richiesta «db.collection.find({_id: ‘some-id-value’})» può essere completamente elaborata in PostgreSQL. L'obiettivo primario del progetto in questa fase di sviluppo è raggiungere la compatibilità con MongoDB, mentre le prestazioni sono attualmente messe in secondo piano. Tra le modifiche funzionali nella nuova versione si segnala il supporto per tutti gli operatori bitwise, l'operatore di confronto «$eq», nonché gli operatori «$elemMatch» e «$bitsAllClear».
Fonte: opennet.ru
