FerretDB 0.1 发布,基于 PostgreSQL DBMS 的 MongoDB 实现

FerretDB 0.1项目(以前的MangoDB)版本已经发布,允许您在不更改应用程序代码的情况下用PostgreSQL替换面向文档的DBMS MongoDB。 FerretDB 被实现为代理服务器,它将对 MangoDB 的调用转换为对 PostgreSQL 的 SQL 查询,从而允许 PostgreSQL 用作实际存储。 该代码是用 Go 编写的,并根据 Apache 2.0 许可证分发。

由于 MongoDB 过渡到专有 SSPL 许可证,可能会出现迁移的需要,该许可证基于 AGPLv3 许可证,但不开放,因为它包含在 SSPL 许可证下交付的歧视性要求,不仅要交付应用程序代码本身,而且还要交付应用程序代码本身。提供云服务涉及的所有组件的源代码。

FerretDB的目标受众是在应用程序中不使用MongoDB高级功能,但希望使用完全开放的软件堆栈的用户。 在当前的开发阶段,FerretDB 仍然只支持典型应用中最常用的部分 MongoDB 功能。 未来,他们计划实现与 MongoDB 驱动程序的完全兼容,并提供使用 FerretDB 作为 MongoDB 透明替代品的能力。

让我们回想一下,MongoDB 在以键/值格式操作数据的快速且可扩展的系统与功能强大且易于制定查询的关系 DBMS 之间占据着一席之地。 MongoDB 支持以类似 JSON 的格式存储文档,具有相当灵活的语言来生成查询,可以为各种存储属性创建索引,有效地提供大型二进制对象的存储,支持记录更改和向数据库添加数据的操作,可以按照Map/Reduce范式工作,支持容错配置的复制和构建。

FerretDB 0.1.0 的发布完全重新设计了从 PostgreSQL 检索数据的方法。 以前,对于每个传入的 MongoDB 请求,都会使用用于处理 JSON 格式并在 PostgreSQL 端过滤结果的函数,向 PostgreSQL 生成一个 SQL 查询。 由于 PostgreSQL 和 MongoDB json 函数的语义差异,在比较和排序不同类型时存在行为差异。 为了解决这个问题,现在从 PostgreSQL 中冗余地获取数据,并在 FerretDB 端过滤结果,这使得在大多数情况下复制 MongoDB 的行为成为可能。

提高兼容性的代价是性能下降,在未来的版本中,他们希望通过在 FerretDB 端有选择地过滤仅存在行为差异的查询来弥补这一点。 例如,查询“db.collection.find({_id: 'some-id-value'})”可以完全在 PostgreSQL 中处理。 该项目现阶段开发的首要目标是实现与 MongoDB 的兼容,性能暂时退居次要地位。 新版本的功能变化包括对所有位运算符、“$eq”比较运算符以及“$elemMatch”和“$bitsAllClear”运算符的支持。

来源: opennet.ru

添加评论