Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 与团队共享MongoDB更改_Git_Node.js_Mongodb - Fatal编程技术网

Git 与团队共享MongoDB更改

Git 与团队共享MongoDB更改,git,node.js,mongodb,Git,Node.js,Mongodb,我最近一直在学习如何在Node.js中使用MongoDB,并且一直在想如何与团队的其他成员共享MongoDB更改,例如,通过git存储库 例如,如果我在MongoDB中需要一个名为users的集合,并且该集合中有一些包含givenName和familyName字段的文档,这将非常容易,因为当团队中的每个开发人员运行应用程序时,MongoDB将在代码中写入集合和字段时自动创建它们 现在让我们假设,出于某种原因,我需要将这两个字段重命名为forename和姓氏 该应用程序已经运行了一段时间,因此团队

我最近一直在学习如何在Node.js中使用MongoDB,并且一直在想如何与团队的其他成员共享MongoDB更改,例如,通过git存储库

例如,如果我在MongoDB中需要一个名为
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,只要它一致地处理“模式”更改。或者,您可以忽略这些更改,只担心生产。