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

