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

能否通过MongoDB聚合管道,依据Account的_id修改Information的phonenumber

实现方法

可以通过聚合管道结合更新操作完成需求,以下提供两种可行方案:

方案一:单命令聚合管道关联+更新

适用于MongoDB 4.2及以上版本,利用更新操作的查询阶段嵌入聚合管道,直接关联Account集合定位目标Information文档:

db.Information.updateOne(
  {
    $expr: {
      $eq: [
        "$_id",
        {
          $arrayElemAt: [
            {
              $lookup: {
                from: "Account",
                localField: "_id",
                foreignField: "_infoid",
                as: "matched",
                pipeline: [{ $match: { _id: ObjectId("6348dc197a7b552660170d8b") } }]
              }
            },
            0
          ]
        }
      ]
    }
  },
  { $set: { phonenumber: "123" } }
)

代码说明

  • $expr:允许在查询条件中使用聚合表达式,打破普通查询的语法限制。
  • $lookup:关联Account集合,通过pipeline参数精准匹配你拥有的Account的_id,返回匹配的Account文档数组。
  • $arrayElemAt:取出$lookup返回数组中的第一个元素(因为是一对一关联,只会有一个匹配结果),提取其_infoid值。
  • $eq:将Information文档的_id与上述_infoid对比,定位到需要更新的目标文档。
  • $set:修改目标文档的phonenumber字段为"123"。

方案二:聚合查询获取ID后更新

这种方式更直观且性能更优,先通过查询获取对应_infoid,再执行更新:

// 第一步:从Account集合获取目标_infoid
const targetInfoId = db.Account.findOne({ _id: ObjectId("6348dc197a7b552660170d8b") })._infoid;

// 第二步:更新对应的Information文档
db.Information.updateOne({ _id: targetInfoId }, { $set: { phonenumber: "123" } });

说明

  • findOne是最简单的查询方式,比聚合更轻量,适合这种一对一关联的场景。
  • 拿到_infoid后直接精准匹配Information文档,更新效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:35:39