You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB更新文档时,如何将根字段值推入嵌套数组?

解决方法

要在追加兑换记录时引用文档自身的amount字段,你需要使用MongoDB 4.2+支持的更新管道语法——常规更新操作符无法在嵌套对象里引用文档字段值,而更新管道可以实现这一点。

修正后的代码方案

方案1:用$concatArrays实现数组追加(兼容MongoDB 3.2+)

await datastore.collection('discounts').updateOne(
  {
    $expr: { $gt: ['$maxUses', '$uses'] },
    ...criteria
  },
  [
    {
      $set: {
        uses: 1,
        redemptions: {
          $concatArrays: [
            // 处理redemptions字段不存在的情况
            { $ifNull: ['$redemptions', []] },
            [{
              name: concatNames(user),
              email: user.email,
              amount: '$amount',
              when: new Date()
            }]
          ]
        }
      }
    }
  ]
)

方案2:用管道式$push(MongoDB 4.4+支持)

如果你的MongoDB版本在4.4及以上,可以直接在更新管道里使用$push聚合阶段,写法更直观:

await datastore.collection('discounts').updateOne(
  {
    $expr: { $gt: ['$maxUses', '$uses'] },
    ...criteria
  },
  [
    { $set: { uses: 1 } },
    {
      $push: {
        redemptions: {
          name: concatNames(user),
          email: user.email,
          amount: '$amount',
          when: new Date()
        }
      }
    }
  ]
)

原写法失效的原因

常规更新操作符(比如外层的$push)属于替换式更新,嵌套对象里的'$amount'会被当作字面量字符串存储,而非引用文档的字段值;而更新管道是聚合式更新,支持在操作中直接引用文档的现有字段,适配这类需要动态取值的场景。

内容的提问来源于stack exchange,提问作者Dexter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:25:19