首页 > 解决方案 > Mongo findOne 不返回数据,即使它存在索引

问题描述

我有一个超过 2M 条目的答案模式。架构是

{
  user: {                                                                                                                                     
      type: Schema.Types.ObjectId,                                                                                                        
      ref: 'User',                                                                                                                
  },                                                                                                                                  
  q: {                                                                                                                                        
      type: Schema.Types.ObjectId,                                                                                                        
      ref: 'Question',                                                                                                            
  },                                                                                                                                  
  answer: {                                                                                                                                   
      type: String,                                                                                                                       
      required: [true, 'Answer required'],                                                                                        
  } 
}

在 submitAnswers 路由上,我正在根据 user 和 q 使用 findOne 检查答案是否存在,如果存在则更新 else create

let check = await Answer.findOne({user: u_id, q: q_id})
if(check) {
    check.answer = new_answer
    await check.save()
    return res.json({message: "Answer saved"})
} else {
    let result = //Aggregate query
    if(result) {
         throw Error();
    }
    await Answer.create({user: u_id, q:q_id, answer: new_answer})
    return res.json({message: "Answer saved"})
}

我目前{q: 1, user: 1}在 Schema 上有索引,以便更快地搜索。尽管如此,数据库中仍有大量具有相同用户和 q 值的重复数据。

不能使用 upsert,因为这会导致每次都调用该聚合查询进行检查,这是一个繁重的查询

我错过了什么吗?或者索引创建需要时间?它是一个重型用户服务器。

仅在具有并发用户的生产服务器上面对此问题

标签: node.jsmongodbexpressmongoose

解决方案


你可能有一个竞争条件。如果 2 个人同时提交相同的 u_id 和 q_id,他们都会发现还没有一个,然后跳到 else 块,在那里他们都创建了一个新文档。


推荐阅读