在mongoDB的实时环境中,如何确保能够“撤消”更新操作?

问题描述 投票:0回答:1

由于工作政策,我无法分享具体信息,但基本上在我的集合中,一些但并非所有记录在数组中都有一个元素“wannaRemove”。从功能上讲,该元素存在于随机记录中 - 一旦将其删除,就无法在没有回滚或事先计划的情况下确定哪些记录拥有该元素。除了基础知识之外,我对 Mongo 缺乏经验。

我需要有一个回滚计划,以便我们可以在更改后一段时间内监控系统,如果有任何错误,则撤消更改。

在我们执行此操作时,环境将处于活动状态,因此可以在删除该字段之后但在我们决定撤消它之前修改记录...所以我不能只是回滚到更改之前进行的转储。由于记录数量非常多,因此手动撤消是不可行的。 我必须实际进行更改的脚本如下:

db.myCollection.updateMany({"myArray.wannaRemove":{$exists:true}},{$unset:{"myArray.$[].wannaRemove":1}},false,true)

如何确保在监控期后能够撤消此更改?

mongodb rollback
1个回答
0
投票

您可以采用几种可能的方法来应对不同程度的复杂性和开销,具体取决于其复杂程度、您对代码的信心程度等等。

我个人建议使用以下两个选项之一,根据个人喜好进行评级。

  1. 进行逻辑删除,我个人宁愿尽可能进行逻辑删除 - 这是我个人最喜欢的方法。 它允许您恢复/跟踪任何删除,同时您的应用程序可以处理此类项目的逻辑。

例如,您可以设置一个带有时间戳的删除字段,之后您可以查询:

  db.myCollection.updateMany(
    { 'myArray.wannaRemove': { $exists: true } },
    {
      $set: { 'myArray.$[].removedAt': new Date() },
      $unset: { 'myArray.$[].wannaRemove': 1 },
    },
    false, true);

显然,这只会跟踪“最新”删除,如果可能发生多次删除,您可以维护一个日期数组。

  1. 使用变更流并创建相关操作的转储,使用变更流您可以“监听”此集合,每当发生此特定事件时您可以将其转储到单独的集合。这将提供所有事件的非常清晰的“历史记录”,并且还允许您在需要时恢复以前的状态。
© www.soinside.com 2019 - 2024. All rights reserved.