猫鼬 - 重命名数组中的对象键

Mongoose - renaming object key within array

我有这个模式

{
  _id: "123456",
  id: "123",
  inventory: [
    {
      id: "foo",
      count: 0
    },
    {
      id: "bar",
      count: 3
    }
  ]
}

我希望库存数组中的每个“计数”键都是“价格”,最后看起来像这样:

{
  _id: "123456",
  id: "123",
  inventory: [
    {
      id: "foo",
      price: 0
    },
    {
      id: "bar",
      price: 3
    }
  ]
}

我试过了

Model.updateOne({ id: "123" }, { $unset: { inventory: [{ count: 1 }] } } )

但它似乎正在删除“库存”字段本身

这里的第一件事是尝试使用 $rename 但是文档是如何解释的:

$rename does not work if these fields are in array elements.

所以需要另寻他法。因此,您可以将此更新与聚合查询一起使用:

此查询主要使用$map$arrayToObject$objectToArray。这里的技巧是:

  • 创建一个名为 inventory 的新字段(覆盖现有字段)
  • 使用 $map 遍历数组的每个值,然后为数组中的每个对象使用 $objectToArray 创建一个数组,并再次使用 [=12= 遍历第二个数组].
  • 在第二次迭代中创建字段 kv。字段 v 将相同(您不想更改值,只更改键)。而对于字段 k,您只需更改与您的条件匹配的字段,即仅从 count 更改为 price。如果此条件不匹配,则密钥保留。
db.collection.update({},
[
  {
    $set: {
      inventory: {
        $map: {
          input: "$inventory",
          in: {
            $arrayToObject: {
              $map: {
                input: {$objectToArray: "$$this"},
                in: {
                  k: {
                    $cond: [
                      {
                        $eq: ["$$this.k","count"]
                      },
                      "price",
                      "$$this.k"
                    ]
                  },
                  v: "$$this.v"
                }
              }
            }
          }
        }
      }
    }
  }
])

示例here