ΠΠ·Π΄Π°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° FerretDB 0.1 (ΠΏΠΎ-ΡΠ°Π½ΠΎ MangoDB) Π±Π΅ΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½ΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠ°Π½Π°ΡΠ° ΠΊΡΠΌ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ Π‘Π£ΠΠ MongoDB Ρ PostgreSQL, Π±Π΅Π· Π΄Π° ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. FerretDB Π΅ Π²Π½Π΅Π΄ΡΠ΅Π½ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠΊΡΠΈ ΡΡΡΠ²ΡΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½ΠΈΡΡΠ° ΠΊΡΠΌ MangoDB Π² SQL Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ PostgreSQL, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° PostgreSQL Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°ΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅. ΠΠΎΠ΄ΡΡ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Go ΠΈ ΡΠ΅ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π° ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·Π° Apache 2.0.
ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΡΠ·Π½ΠΈΠΊΠ½Π΅ ΠΏΠΎΡΠ°Π΄ΠΈ ΠΏΡΠ΅Ρ ΠΎΠ΄Π° Π½Π° MongoDB ΠΊΡΠΌ ΠΏΠ°ΡΠ΅Π½ΡΠΎΠ²Π°Π½ SSPL Π»ΠΈΡΠ΅Π½Π·, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π°Π²Π° Π½Π° AGPLv3 Π»ΠΈΡΠ΅Π½Π·Π°, Π½ΠΎ Π½Π΅ Π΅ ΠΎΡΠ²ΠΎΡΠ΅Π½, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΡΠ΄ΡΡΠΆΠ° Π΄ΠΈΡΠΊΡΠΈΠΌΠΈΠ½Π°ΡΠΈΠΎΠ½Π½ΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½Π΅ Π·Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠ½Π΅ ΠΏΠΎΠ΄ SSPL Π»ΠΈΡΠ΅Π½Π·Π° Π½Π΅ ΡΠ°ΠΌΠΎ Π½Π° ΡΠ°ΠΌΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, Π½ΠΎ ΠΈ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ, ΡΡΠ°ΡΡΠ²Π°ΡΠΈ Π² ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠ½Π΅ΡΠΎ Π½Π° ΠΎΠ±Π»Π°ΡΠ½Π° ΡΡΠ»ΡΠ³Π°.
Π¦Π΅Π»Π΅Π²Π°ΡΠ° Π°ΡΠ΄ΠΈΡΠΎΡΠΈΡ Π½Π° FerretDB ΡΠ° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° MongoDB Π² ΡΠ²ΠΎΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½ΠΎ ΠΈΡΠΊΠ°Ρ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΡΠΎΡΡΡΠ΅ΡΠ΅Π½ ΡΡΠ΅ΠΊ. ΠΠ° Π½Π°ΡΡΠΎΡΡΠΈΡ Π΅ΡΠ°ΠΏ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° FerretDB Π²ΡΠ΅ ΠΎΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ°ΠΌΠΎ ΡΠ°ΡΡ ΠΎΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° MongoDB, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π½Π°ΠΉ-ΡΠ΅ΡΡΠΎ Π² ΡΠΈΠΏΠΈΡΠ½ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ΅ ΠΏΠ»Π°Π½ΠΈΡΠ°Ρ Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π°Ρ ΠΏΡΠ»Π½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΈΡΠ΅ Π·Π° MongoDB ΠΈ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° FerretDB ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠ·ΡΠ°ΡΠ΅Π½ Π·Π°ΠΌΠ΅ΡΡΠΈΡΠ΅Π» Π½Π° MongoDB.
Π‘ΠΏΠΎΠΌΠ½Π΅ΡΠ΅ ΡΠΈ, ΡΠ΅ MongoDB Π·Π°Π΅ΠΌΠ° Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ Π±ΡΡΠ·ΠΈ ΠΈ ΠΌΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ°Π±ΠΎΡΡΡ Ρ Π΄Π°Π½Π½ΠΈ Π²ΡΠ² ΡΠΎΡΠΌΠ°Ρ ΠΊΠ»ΡΡ / ΡΡΠΎΠΉΠ½ΠΎΡΡ, ΠΈ ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π½ΠΈ Π‘Π£ΠΠ, ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈ ΠΈ ΡΠ΄ΠΎΠ±Π½ΠΈ ΠΏΡΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ. MongoDB ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ Π²ΡΠ² ΡΠΎΡΠΌΠ°Ρ, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° JSON, ΠΈΠΌΠ° Π΄ΠΎΡΡΠ° Π³ΡΠ²ΠΊΠ°Π² Π΅Π·ΠΈΠΊ Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π²Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈ Π°ΡΡΠΈΠ±ΡΡΠΈ, ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ Π΄Π²ΠΎΠΈΡΠ½ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° ΠΏΡΠΎΠΌΡΠ½Π° ΠΈ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΊΡΠΌ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, ΠΌΠΎΠΆΠ΅ ΡΠ°Π±ΠΎΡΠΈ Π² ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Ρ ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΠ°ΡΠ° Map/Reduce, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΈ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΡΡΠΎΠΉΡΠΈΠ²ΠΈ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ.
ΠΡΡΠΊΠ°Π½Π΅ΡΠΎ Π½Π° FerretDB 0.1.0 Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΏΡΠ΅ΡΠ°Π±ΠΎΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° Π·Π° ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ PostgreSQL. ΠΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° Π·Π° Π²ΡΡΠΊΠ° Π²Ρ ΠΎΠ΄ΡΡΠ° MongoDB Π·Π°ΡΠ²ΠΊΠ° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ Π΅Π΄Π½Π° SQL Π·Π°ΡΠ²ΠΊΠ° ΠΊΡΠΌ PostgreSQL, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ JSON ΡΠΎΡΠΌΠ°ΡΠ° ΠΈ ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΡΡΡΠ°Π½Π° Π½Π° PostgreSQL. ΠΠΎΡΠ°Π΄ΠΈ ΡΠ°Π·Π»ΠΈΠΊΠΈ Π² ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠ°ΡΠ° Π½Π° json ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Π½Π° PostgreSQL ΠΈ MongoDB, ΠΈΠΌΠ°ΡΠ΅ Π½Π΅ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Π² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ ΠΏΡΠΈ ΡΡΠ°Π²Π½ΡΠ²Π°Π½Π΅ ΠΈ ΡΠΎΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅. ΠΠ° Π΄Π° ΡΠ΅ ΡΠ΅ΡΠΈ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, Π΄Π°Π½Π½ΠΈΡΠ΅ Π²Π΅ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²Π»ΠΈΡΠ°Ρ ΠΈΠ·Π»ΠΈΡΠ½ΠΎ ΠΎΡ PostgreSQL ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ ΡΠ΅ ΡΠΈΠ»ΡΡΠΈΡΠ° ΠΎΡ ΡΡΡΠ°Π½Π° Π½Π° FerretDB, ΠΊΠΎΠ΅ΡΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΠΏΡΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° MongoDB Π² ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΠΈΡΡΠ°ΡΠΈΠΈ.
Π¦Π΅Π½Π°ΡΠ° Π½Π° ΡΠ²Π΅Π»ΠΈΡΠ΅Π½Π°ΡΠ° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Π±Π΅ΡΠ΅ Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°, ΠΊΠΎΠ΅ΡΠΎ Π² Π±ΡΠ΄Π΅ΡΠΈ Π²Π΅ΡΡΠΈΠΈ ΡΠ΅ ΠΎΡΠ°ΠΊΠ²Π°Ρ Π΄Π° ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡΠ°Ρ ΡΡΠ΅Π· ΡΠ΅Π»Π΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ ΠΎΡ ΡΡΡΠ°Π½Π° Π½Π° FerretDB ΡΠ°ΠΌΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ, Π·Π° ΠΊΠΎΠΈΡΠΎ ΠΈΠΌΠ° Π½Π΅ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Π² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°ΡΠ²ΠΊΠ°ΡΠ° "db.collection.find({_id: 'some-id-value'})" ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½Π° ΠΈΠ·ΡΡΠ»ΠΎ Π² PostgreSQL. ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠ΅Π» Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ MongoDB, Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π·Π°ΡΠ΅Π³Π° ΠΎΡΡΠ°Π²Π° Π½Π° Π·Π°Π΄Π΅Π½ ΠΏΠ»Π°Π½. Π‘ΡΠ΅Π΄ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ ΡΠ΅ ΠΎΡΠ±Π΅Π»ΡΠ·Π²Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° Π²ΡΠΈΡΠΊΠΈ Π±ΠΈΡΠΎΠ²ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ, ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° Π·Π° ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ β$eqβ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈΡΠ΅ β$elemMatchβ ΠΈ β$bitsAllClearβ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru