草庐IT

git - 与团队共享 MongoDB 更改

coder 2023-10-31 原文

关闭。这个问题是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/

有关git - 与团队共享 MongoDB 更改的更多相关文章

  1. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  2. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe

  5. ruby - 更改 ActiveRecord 中对象的类 - 2

    假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。

  6. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  7. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  8. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  9. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

  10. ruby - Watir 更改 Mozilla Firefox 首选项 - 2

    我正在使用Watir运行一个Ruby脚本来为我自动化一些事情。我试图自动将一些文件保存到某个目录。因此,在我的Mozilla设置中,我将默认下载目录设置为桌面并选择自动保存文件。但是,当我开始运行我的脚本时,这些更改并没有反射(reflect)出来。似乎首选项恢复为默认值。我已经包括以下内容require"rubygems"#Optional.require"watir-webdriver"#Forwebautomation.require"win32ole"#Forfilesavedialog.并打开一个新的firefox实例:browser=Watir::Browser.new(:

随机推荐