Byl zveřejněn nový projekt FerretDB 0.1 (dříve MangoDB), který umožňuje nahradit dokumentově orientovanou databázi MongoDB PostgreSQL bez potřeby měnit kód aplikací. FerretDB je realizován jako proxy server, který překládá dotazy na MangoDB do SQL dotazů na PostgreSQL, což umožňuje používat PostgreSQL jako skutečné úložiště. Kód je napsán v jazyce Go a je šířen pod licencí Apache 2.0.
Potřeba migrace může vzniknout v důsledku přechodu MongoDB na neotevřenou licenci SSPL, která je založena na licenci AGPLv3, ale není otevřená, protože obsahuje diskriminační požadavek poskytování nejen kódu samotné aplikace, ale také zdrojových textů všech komponent zapojených do poskytování cloudové služby pod licencí SSPL.
Cílovou skupinou FerretDB jsou uživatelé, kteří ve svých aplikacích nevyužívají pokročilé funkce MongoDB, ale chtějí používat zcela otevřený software. V současné fázi vývoje FerretDB podporuje pouze část funkcí MongoDB, které jsou nejčastěji používány v běžných aplikacích. V budoucnu plánují dosáhnout plné kompatibility s ovladači pro MongoDB a umožnit používat FerretDB jako transparentní náhradu MongoDB.
Připomeňme, že MongoDB se nachází v mezeře mezi rychlými a škálovatelnými systémy, které operují s daty ve formátu klíč/hodnota, a relačními databázovými systémy, které jsou funkční a pohodlné při vytváření dotazů. MongoDB podporuje ukládání dokumentů v JSON podobném formátu, má dostatečně flexibilní jazyk pro vytváření dotazů, může vytvářet indexy pro různé ukládané atributy, efektivně zajišťuje ukládání velkých binárních objektů, podporuje logování operací při změně a přidávání dat do databáze, může fungovat podle paradigmatu Map/Reduce, podporuje replikaci a budování odolných konfigurací.
Ve verzi FerretDB 0.1.0 byl kompletně přepracován postup pro extrakci dat z PostgreSQL. Dříve byl pro každý příchozí dotaz MongoDB generován jeden SQL dotaz na PostgreSQL, který využíval funkce pro práci s formátem JSON a prováděl filtrování výsledků na straně PostgreSQL. Z důvodu rozdílů v semantice json-funkcí PostgreSQL a MongoDB bylo pozorováno nesoulad v chování při porovnávání a řazení různých typů. Pro vyřešení tohoto problému se nyní z PostgreSQL extrahuje nadbytečná množina dat a filtrování výsledků se provádí na straně FerretDB, což umožnilo reprodukovat chování MongoDB ve většině situací.
Cena zvýšené kompatibility byla snížení výkonu, které se v budoucích verzích plánuje kompenzovat selektivním filtrováním na straně FerretDB pouze těch dotazů, u kterých dochází k nesouladu chování. Například dotaz „db.collection.find({_id: ‘some-id-value’})“ může být zcela zpracován v PostgreSQL. Primárním cílem projektu v této fázi vývoje je dosažení kompatibility s MongoDB, zatímco výkon je zatím odsunout na druhou kolej. Z funkčních změn v nové verzi je zmiňována podpora všech bitových operátorů, operátoru porovnání „$eq“, stejně jako operátorů „$elemMatch“ a „$bitsAllClear“.
Zdroj: opennet.ru
