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
相关产品推荐
相关产品推荐

