node.js - 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,因为这会导致每次都调用该聚合查询进行检查,这是一个繁重的查询
我错过了什么吗?或者索引创建需要时间?它是一个重型用户服务器。
仅在具有并发用户的生产服务器上面对此问题
解决方案
你可能有一个竞争条件。如果 2 个人同时提交相同的 u_id 和 q_id,他们都会发现还没有一个,然后跳到 else 块,在那里他们都创建了一个新文档。
推荐阅读
- ruby-on-rails - 单击选项卡时防止滚动到顶部
- sql - 从 SQL Server 中删除最后一条记录?
- python - 为什么我不能在 Python 中使用变量作为参数调用此函数?
- regex - 删除第二个反斜杠剩下的所有内容
- google-app-maker - AppMaker:在 TableRow 中添加变量链接时出现 TypeError
- python - 我在以下程序中将 'mapped_list' 清空而没有清除它。请解释
- node.js - 异步函数给等待仅在异步函数中有效
- charts - 如何在 Flutter 中将图表线条颜色更改为自定义颜色代码值
- python - 在布尔列表上创建或约束
- swift - MKTileOverlay,180.0 / -180.0 处的图块未一致绘制