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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:24:24