MongoDB中嵌套数组最后一项raised值的累加更新实现
直接更新MongoDB嵌套数组最后一项的raised字段
你可以利用MongoDB的原子更新操作符一步完成需求,不需要先查询再计算,核心是用$inc做数值累加,配合数组位置操作符定位最后一项。
方案一:MongoDB 4.2+ 推荐用法
MongoDB 4.2及以上版本支持$[-1](数组末尾位置操作符),可以直接定位数组的最后一个元素,代码示例如下:
const { MongoClient } = require('mongodb'); async function updateLastRaised() { const client = new MongoClient('你的MongoDB连接字符串'); try { await client.connect(); const db = client.db('目标数据库名'); const coll = db.collection('目标集合名'); const targetOrgId = 'ORG1'; // 要匹配的组织ID const addValue = 500; // 需要累加的数值 const updateResult = await coll.updateOne( { account_id: targetOrgId }, // 匹配条件 { $inc: { 'progress.$[-1].raised': addValue } } // 更新操作:累加最后一项的raised ); console.log(`匹配到${updateResult.matchedCount}条文档,成功更新${updateResult.modifiedCount}条`); } finally { await client.close(); } } updateLastRaised();
关键说明:
$[-1]:专门用来定位数组的最后一个元素,语法简洁直观$inc:原子性的数值累加操作,避免了先查询再更新可能导致的并发数据不一致问题
方案二:适配MongoDB 4.2以下版本
如果你的MongoDB版本低于4.2,可以结合$expr、$size和$indexOfArray来定位最后一项:
const updateResult = await coll.updateOne( { account_id: targetOrgId, $expr: { // 匹配数组中索引等于数组长度-1的元素(即最后一项) $eq: [{ $indexOfArray: ['$progress', '$$CURRENT'] }, { $subtract: [{ $size: '$progress' }, 1] }] } }, { $inc: { 'progress.$.raised': addValue } } );
内容的提问来源于stack exchange,提问作者Ahmed Haque
相关产品推荐
相关产品推荐

