git - 与团队共享 MongoDB 更改

标签 git node.js mongodb

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

8 年前关闭。




Improve this question




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

例如,如果我需要一个名为 users 的集合在 MongoDB 中,并且该集合有一些包含字段 givenName 的文档和 familyName ,这很容易做到,因为当团队中的每个开发人员运行应用程序时,MongoDB 将自动创建代码中编写的集合和字段。

现在假设出于某种原因我需要将两个字段重命名为 forenamesurname .

该应用程序已经运行了一段时间,因此团队中的所有开发人员都拥有 users 的本地副本。包含带有 givenName 的文档的集合和 familyName ;生产服务器也是如此。

据我所知,我不能简单地更改代码中的字段名称以使用新的字段名称,因为我们会“丢失”旧字段名称中使用的任何数据(“丢失”我当然是指我们只是不会再看到旧数据,即使它仍然存在,正如预期的那样)。

所以我想我还必须在 MongoDB shell 中运行一个命令来重命名所有相关文档中的字段。

但是如果我这样做,那么只有我的本地副本 users收藏是最新的。

使用 MySQL 时,我们要么只在需要时运行的 SQL 文件中通过 git 共享我们的所有更改,要么在可用时使用迁移,例如在 PHP 中的 Laravel 框架中。

我们会不会像使用 MySQL 一样做同样的事情并保留一个 changes.js我们在 MongoDB shell 中运行的文件?

或者有没有更好的方法来做到这一点,也许在应用程序代码本身中,以便在开发人员运行应用程序时自动运行更改?

换句话说,在团队成员之间共享 MongoDB 更改的最佳实践是什么?

最佳答案

对于几乎所有的持久性系统来说,数据迁移都是一个巨大的痛苦。有两大策略:懒惰和急切的迁移。

对于 懒惰迁移,你需要你的代码来处理 新旧数据结构 .不幸的是,我不知道 node.js mongodb 驱动程序在内部是如何工作的。例如,在 C# 驱动程序中,可以注册自定义序列化程序、定义别名或使用 C# 的 getter 和 setter 来启用此行为。所以Forename字段将从 givenName 读取或 Forename ,但是当将其存储回数据库时,它将始终序列化为 Forename .

这种策略的问题在于它不适用于查询,例如{"Forename" : "John"}将失败,因为某些文档尚未迁移。当然,索引甚至唯一约束会使事情变得更糟。

渴望 迁移需要某种脚本,它基本上贯穿数据库中的所有文档,并根据您的需要更新它们。通常,这是更简单的路径,它不会中断查询。但是,您需要在正确的时间运行此脚本,对于大型数据集,这可能需要一段时间。在此期间,您的系统要么停机,要么提供不正确的结果。

因此,数据量越大,必须允许越多的“懒惰”。例如,您可能希望为每个用户运行脚本(而不是按自然顺序),这样用户就不太可能达到其数据的“半迁移”状态。尽管如此,您还是希望您的代码能够处理这个问题。

对于这两种策略,当事情变得复杂时,可能需要模式版本控制,即单个文档具有类似 _sv 的字段。并且有些脚本知道如何从版本 n 获取到版本 n+1 .然后,您可以使脚本非常抽象和幂等,这样您就可以运行它们而不必担心在新数据上运行旧脚本会破坏任何东西。

关于git - 与团队共享 MongoDB 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19396192/

相关文章:

Gitlab-ci.yml 创建 merge 请求

javascript - 从不同目录运行早午餐并使用相对路径

git - Atom 编辑器不会重新加载已更改的文件

javascript - 断开连接后套接字不会清理

spring - 在将它们添加到 MongoDB 之前,如何在 Spring Data 中处理插入请求?

javascript - Angular 似乎没有运行

javascript - Mongoose 嵌入式文档更新

git - ssh_exchange_identification : Connection closed by remote host under Git bash

node.js - 如何使用node的内置调试器同时调试两个node应用程序?

javascript - 从外部 Node 进程连接到 Azure Web App/SQL 数据库