如何在MongoDB的updateOne()中$pull后重新统计嵌套数组长度?
解决方法:在
updateOne中完成数组移除并更新长度统计 你不能直接在$set里调用模型的聚合方法,MongoDB支持在更新操作中使用聚合管道实现这种依赖更新后状态的字段赋值,具体修改方式如下:
完整代码示例
const reset_qr_list_and_update_count = await stock_read_log.updateOne( { payload: { $ne: req.body.payload }, "qr_list.payload": req.body.new_qr_list[indexx].payload, company_id: req.body.company_id }, [ // 第一步:执行$pull移除指定元素 { $pull: { qr_list: { payload: req.body.new_qr_list[indexx].payload } } }, // 第二步:统计剩余qr_list的长度并赋值给qty { $set: { qty: { $size: "$qr_list" } } } ] );
关键说明
- 使用聚合管道数组作为
updateOne的第二个参数(MongoDB 4.2及以上版本支持),可按顺序执行多个更新操作:先完成$pull移除数组元素,再基于更新后的qr_list计算长度。 $size运算符直接获取数组长度,引用更新后的$qr_list字段即可得到剩余元素数量,无需额外聚合查询。- 这种写法保证了
$pull和qty更新的原子性,不会出现中间状态不一致的问题。
内容的提问来源于stack exchange,提问作者Danang Satriani
相关产品推荐
相关产品推荐

