让我变得真正简单。我正在运行node.js服务器。从补丁程序请求接收数据时,首先需要检入数据库。如果该行存在,我将对其进行更新,否则,我将创建该记录。这是我的代码。这就是我在请求处理程序回调中调用的内容。
let dbCollection = db$master.collection('users');
createUser(req.body).then(user => {
dbCollection.updateMany(
{ rmisId: req.body.rmisId },
{ $set: { ...user } },
{ upsert: true }
).then((result) => {
log.debug("RESULTS", user);
return result;
})
.catch((err => {
log.debug(err);
return err;
}));
})
这在顺序请求中运行良好。但是当我收到10个并发请求时,它会创建重复记录。我正在本地计算机上运行,并使用Apache JMeter复制并发请求。如果您遇到这种问题,请帮助我。
谢谢!
更新
我已经测试了另一种读取数据库的方法,例如dbCollection.find({rmisId: req.body.rmisId})
数据库,以确定其是否存在。但这根本没有区别。
答案 0 :(得分:1)
您无法检查和更新。 Mongodb操作在文档级别是原子的。在检查并确认记录不存在之后,可能会再次请求创建您刚刚检查的文档,然后,如果您没有唯一索引或正在生成ID,则可以重新创建同一记录。>
相反,您可以像已经在使用upsert一样使用,但无需创建。看起来您正在从请求中获取ID,因此只需使用该ID进行搜索,然后添加用户记录即可。这样,如果其他线程在执行此操作之前将其插入,则将更新先前插入的线程。如果您不喜欢这种方式,请为该用户ID字段添加唯一索引。