由于工作政策,我无法分享具体信息,但基本上在我的集合中,一些但并非所有记录在数组中都有一个元素“wannaRemove”。从功能上讲,该元素存在于随机记录中 - 一旦将其删除,就无法在没有回滚或事先计划的情况下确定哪些记录拥有该元素。除了基础知识之外,我对 Mongo 缺乏经验。
我需要有一个回滚计划,以便我们可以在更改后一段时间内监控系统,如果有任何错误,则撤消更改。
在我们执行此操作时,环境将处于活动状态,因此可以在删除该字段之后但在我们决定撤消它之前修改记录...所以我不能只是回滚到更改之前进行的转储。由于记录数量非常多,因此手动撤消是不可行的。 我必须实际进行更改的脚本如下:
db.myCollection.updateMany({"myArray.wannaRemove":{$exists:true}},{$unset:{"myArray.$[].wannaRemove":1}},false,true)
如何确保在监控期后能够撤消此更改?
您可以采用几种可能的方法来应对不同程度的复杂性和开销,具体取决于其复杂程度、您对代码的信心程度等等。
我个人建议使用以下两个选项之一,根据个人喜好进行评级。
例如,您可以设置一个带有时间戳的删除字段,之后您可以查询:
db.myCollection.updateMany(
{ 'myArray.wannaRemove': { $exists: true } },
{
$set: { 'myArray.$[].removedAt': new Date() },
$unset: { 'myArray.$[].wannaRemove': 1 },
},
false, true);
显然,这只会跟踪“最新”删除,如果可能发生多次删除,您可以维护一个日期数组。