【问题标题】:How to migrate value of nested subdocument in array in Mongoose如何在 Mongoose 的数组中迁移嵌套子文档的值
【发布时间】:2021-04-22 19:14:30
【问题描述】:

我有一个名为 Track 的 Mongoose 集合,它有一个 fitnessPlan 子文档数组,每个子文档当前都有一个 month 字段,需要在生产中更改为 week。我正在使用mongoose-migrate 将这些值从旧月份字段迁移到新的星期字段。这是我目前得到的:

async function up () {
  await Track.updateMany({},
    {
      $set: {
        'fitnessPlans.$[elem].month': '$fitnessPlans.$[elem].week',
      },
    },
    { arrayFilters: [{ "elem.week": { $gte: 0 } }], strict: false, });
  
    await Track.updateMany({},
      {
        $unset: {
          'fitnessPlans.$[elem].week': '',
        },
      },
      { arrayFilters: [{ "elem.week": { $gte: 0 } }], strict: false, });
}

但是,mongoose-migrate 抛出以下错误:

Cast to number failed for value "$fitnessPlans.$[elem].week" at path "month"

我猜这是因为字符串没有正确评估,但我不确定如何在此设置中引用该字段的值。

【问题讨论】:

  • 您只想按月重命名该字段?还是两者都需要?
  • 是的,我想重命名该字段,但无法将 $rename 用于数组中的文档,因此您需要执行 $set 和 $unset

标签: mongodb mongoose migrate


【解决方案1】:

从 MongoDB 4.2 开始尝试update with aggregation pipeline

  • $map 使用 $mergeObjects 迭代 fitnessPlans 数组的循环与当前和新创建的 week 字段合并对象@
  • $unsetmonth字段
async function up () {
  await Track.updateMany({},
  [
    {
      $set: {
        fitnessPlans: {
          $map: {
            input: "$fitnessPlans",
            in: {
              $mergeObjects: ["$$this", { week: "$$this.month" }]
            }
          }
        }
      }
    },
    { $unset: "fitnessPlans.month" }
  ],
  { strict: false });
}

Playground

【讨论】:

  • 试过这个,现在得到错误The dollar ($) prefixed field '$set' in '0.$set' is not valid for storage.
  • 啊,没关系,我检查了操场,发现你设置了multi: true,当我用它代替strict: false时,它似乎工作了。
  • multi: true 使用 updateMany 方法时不需要,并且 Playground 不支持 updateMany 方法。
  • 知道了。迁移确实成功运行(它被列为“向上”),但不幸的是,现有文档似乎仍然有月份字段并且没有星期字段。
  • 你错过了什么,打印查询响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2015-07-03
  • 2020-06-07
  • 2017-05-03
  • 2019-02-01
相关资源
最近更新 更多