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

MongoDB中Set与Pop组合更新问题:设置current_book并弹出数组首元素

MongoDB 更新操作:将current_book设为upcoming_book首元素并移除该元素

问题场景

现有数据库样本:

db={
  "sample": [
    {
      current_book: "Aurthor",
      upcoming_book: [
        "Sigma",
        "Rocky"
      ]
    }
  ]
}

需要实现:将current_book的值设置为upcoming_book数组的第一个元素,同时移除该数组的第一个元素,预期输出:

[
  {
    "current_book": "Sigma",
    "upcoming_book": [
      "Rocky"
    ]
  }
]

此前尝试普通update操作时,current_book被设为表达式而非实际值,仅成功弹出数组首元素;使用聚合管道更新时,因$pop不是合法管道阶段报错。

解决方案

使用聚合管道式更新操作,结合$arrayElemAt和$slice实现需求,具体语句如下:

db.sample.updateOne(
  {},
  [
    {
      $set: {
        current_book: { $arrayElemAt: ["$upcoming_book", 0] },
        upcoming_book: { $slice: ["$upcoming_book", 1, { $size: "$upcoming_book" }] }
      }
    }
  ]
)

操作说明

  • $arrayElemAt: ["$upcoming_book", 0]:提取upcoming_book数组的第一个元素,赋值给current_book
  • $slice: ["$upcoming_book", 1, { $size: "$upcoming_book" }]:从数组索引1的位置开始截取,等价于移除第一个元素
  • 聚合管道式update支持在$set中用表达式计算字段值,这是普通update无法实现的;而$pop不属于聚合管道阶段,因此改用$slice完成数组元素移除操作

执行上述语句后即可得到预期结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:55:14