You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
  }
}

额外注意事项

  1. 建议给异步操作添加错误捕获,避免未处理的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);
  }
}
  1. 如果entryPrice是数值类型,要确保传入的params.entryPrice也是数值,避免因类型不匹配导致查询不到(比如存的是100,传的是"100")。

内容的提问来源于stack exchange,提问作者tom3800

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:40:39