MongoDB多字段校验重复:空集合下findOne误判无法新增交易
问题分析与解决方案
核心问题:未正确处理异步函数的返回值
你的代码里最关键的错误是在createNewPostion函数中调用findPosition时没有使用await关键字。因为findPosition是异步函数,它的返回值是一个Promise对象,而非直接的查询结果。Promise对象在布尔判断中永远是真值(truthy),所以!res的条件永远不成立——哪怕集合是空的,也不会执行createPostion。
关于你的疑问:集合无匹配项时findOne的返回值
没错,当集合中没有匹配查询条件的文档时,findOne确实会返回null。但你现在拿到的不是这个返回值,而是未兑现的Promise,导致判断逻辑完全失效。
修正后的代码
async function createPosition(params, uid){ let position = new OpenPositionModel({ uid : uid, symbol : params.symbol, entryPrice: params.entryPrice }); return position.save(); } async function findPosition(uid, symbol, entryPrice){ // MongoDB多条件查询默认就是逻辑与,$and可以省略,写法更简洁 return OpenPositionModel.findOne({ uid, symbol, entryPrice }); } async function createNewPosition(params, uid){ // 必须用await获取异步函数的实际返回值 let res = await findPosition(uid, params.symbol, params.entryPrice); if(!res){ // 这里建议加上await,确保创建操作完成,同时便于处理可能的错误 await createPosition(params, uid); } }
额外注意事项
- 建议给异步操作添加错误捕获,避免未处理的Promise拒绝:
async function createNewPosition(params, uid){ try { let res = await findPosition(uid, params.symbol, params.entryPrice); if(!res){ await createPosition(params, uid); } } catch (err) { // 处理查询或创建时的错误,比如数据库连接问题、字段验证失败等 console.error('操作失败:', err); } }
- 如果
entryPrice是数值类型,要确保传入的params.entryPrice也是数值,避免因类型不匹配导致查询不到(比如存的是100,传的是"100")。
内容的提问来源于stack exchange,提问作者tom3800
相关产品推荐
相关产品推荐

