Git 与团队共享MongoDB更改
我最近一直在学习如何在Node.js中使用MongoDB,并且一直在想如何与团队的其他成员共享MongoDB更改,例如,通过git存储库 例如,如果我在MongoDB中需要一个名为Git 与团队共享MongoDB更改,git,node.js,mongodb,Git,Node.js,Mongodb,我最近一直在学习如何在Node.js中使用MongoDB,并且一直在想如何与团队的其他成员共享MongoDB更改,例如,通过git存储库 例如,如果我在MongoDB中需要一个名为users的集合,并且该集合中有一些包含givenName和familyName字段的文档,这将非常容易,因为当团队中的每个开发人员运行应用程序时,MongoDB将在代码中写入集合和字段时自动创建它们 现在让我们假设,出于某种原因,我需要将这两个字段重命名为forename和姓氏 该应用程序已经运行了一段时间,因此团队
users
的集合,并且该集合中有一些包含givenName
和familyName
字段的文档,这将非常容易,因为当团队中的每个开发人员运行应用程序时,MongoDB将在代码中写入集合和字段时自动创建它们
现在让我们假设,出于某种原因,我需要将这两个字段重命名为forename
和姓氏
该应用程序已经运行了一段时间,因此团队中的所有开发人员都拥有用户
集合的本地副本,其中包含带有givenName
和familyName
的文档;生产服务器也是如此
据我所知,我不能简单地更改代码中的字段名以使用新的字段名,因为这样我们就会“丢失”旧字段名中使用的任何数据(当然,所谓“丢失”的意思是,即使旧数据仍然存在,我们也不会再看到旧数据,正如预期的那样)
因此,我认为我还必须在MongoDB shell中运行一个命令来重命名所有相关文档中的字段
但如果我这样做,则只有users
集合的本地副本是最新的
当使用MySQL时,我们要么在需要时运行的SQL文件中共享git上的所有更改,要么使用迁移,例如在PHP中的Laravel框架中
我们会像处理MySQL一样,保留一个在MongoDB shell中运行的changes.js
文件吗
或者有没有更好的方法来做到这一点,也许是在应用程序代码本身中,以便在开发人员运行应用程序时自动运行更改
换句话说,在团队成员之间共享MongoDB更改的最佳实践是什么?对于几乎所有的持久化系统来说,数据迁移都是一个巨大的难题。有两大策略:懒惰和急切的迁移 对于惰性迁移,您需要您的代码能够处理新旧数据结构。不幸的是,我不知道node.js mongodb驱动程序在内部是如何工作的。例如,在C#驱动程序中,可以注册自定义序列化程序、定义别名或使用C#的getter和setter来启用此行为。因此,
Forename
字段将从givenName
或Forename
读取,但当将其存储回数据库时,它将始终序列化为Forename
此策略的问题在于它不适用于查询,例如,{“Forename”:“John”}
将失败,因为某些文档尚未迁移。当然,索引甚至唯一的约束都会让事情变得更糟
急切的迁移需要某种脚本,它基本上贯穿数据库中的所有文档,并根据您的需要进行更新。通常,这是一条更简单的路径,不会中断查询。但是,您需要在正确的时间运行此脚本,对于大型数据集,这可能需要一段时间。在这段时间内,您的系统要么停机,要么提供不正确的结果
因此,数据量越大,就必须允许更多的“懒散”。例如,您可能希望按每个用户(而不是按自然顺序)运行脚本,以便用户不太可能达到其数据的“半迁移”状态。不过,您还是希望您的代码能够处理这个问题
对于这两种策略,当事情变得复杂时,可能需要模式版本控制,即单个文档有一个类似
\u sv
的字段,并且有一些脚本知道如何从版本n
到版本n+1
。然后,您可以使脚本非常抽象和幂等,这样您就可以运行它们,而不必担心在新数据上运行旧脚本会破坏任何东西。如果您需要测试数据来反映更改,那么迁移脚本似乎是必要的。它可以用于控制台,甚至node.js,只要它一致地处理“模式”更改。或者,您可以忽略这些更改,只担心生产。