Mongoose使用$in查询ID数组时如何保留重复ID对应的多份文档?
Mongoose $in查询重复ID返回对应重复文档及总价计算方案
MongoDB的$in查询本身自带查询条件去重逻辑,同一ID无论出现多少次只会返回一次对应文档,无需循环调用find发起多次数据库请求,仅需一次查询后基于原始ID数组做映射即可满足需求:
const arrOfIds = reqBody.items.map(item => item.productId); // 仅发起一次数据库查询获取所有去重商品文档 Product.find({ '_id': { $in: arrOfIds } }, (error, result) => { if (error) { // 自行处理异常逻辑 return console.error(error) } // 构建ID到商品文档的映射表,加toString()避免ObjectId和字符串ID匹配失败 const productMap = new Map(result.map(product => [product._id.toString(), product])) // 按原始ID数组的顺序、重复情况生成对应商品列表 const productList = arrOfIds.map(id => productMap.get(id.toString())) // 直接计算包含重复ID的商品总价,可根据需求调整字段名 const totalPrice = productList.reduce((sum, product) => sum + (product?.price || 0), 0) })
方案优势:
- 仅发起一次数据库请求,性能远高于循环调用
find的实现 - 完全保留原始ID数组的顺序和重复次数,
productList长度和arrOfIds完全一致 - 逻辑独立,和其他业务代码耦合度低,可直接封装为通用工具函数
- 无需额外依赖,可兼容所有Mongoose版本
内容的提问来源于stack exchange,提问作者quielfala
相关产品推荐
相关产品推荐

