MongoDB如何仅当serial不存在于devices数组时才push新元素,重复能否抛错
问题1:正确校验serial是否存在并实现条件push
你原有写法存在两个问题:
$in: [req.body.serial, '$devices']的匹配逻辑错误:$devices是对象数组,直接拿字符串和数组内的对象做匹配永远返回false- 你将条件判断逻辑写到了更新算子内,更高效且符合MongoDB规范的方案是把「devices数组不存在对应serial」作为查询条件的一部分,只有满足条件才执行push操作,属于原子操作不会有并发冲突,正确代码如下:
const targetSerial = req.body.serial; const updateResult = await userCollection.findOneAndUpdate( // 查询条件:匹配指定用户ID 且 devices数组中无对应serial的元素 { _id: ObjectId('616acc597ebda90ca6ffee21'), 'devices.serial': { $ne: targetSerial } }, // 仅查询匹配成功时执行push操作 { $push: { devices: { serial: targetSerial, data: [] } } }, { returnOriginal: false } );
问题2:serial已存在时的错误处理
当serial已经存在时,上述查询条件会匹配不到文档,updateResult.value会返回null,你可以直接根据这个结果做主动报错处理:
if (!updateResult.value) { // serial已存在,返回自定义错误 return res.status(400).json({ message: '该设备序列号已绑定至当前账号' }); } // 新增成功返回最新用户数据 return res.status(200).json(updateResult.value);
另外注意你原有代码同时混用了await异步语法和回调函数,容易出现逻辑异常,建议统一使用async/await写法即可。
内容的提问来源于stack exchange,提问作者Izak Joubert
相关产品推荐
相关产品推荐

