(实际问题:这是对mongodb进行顺序写入的正确方法,它不会导致竞争条件且无阻塞吗?)
我正在尝试在mongodb中完成文档的顺序写入/更新。操作的顺序有点关键。从某种意义上说,在将下一个操作发送到数据库之前必须完成一个操作。
我现在的方法是使用Bluebirds Promise.mapSeries()
循环遍历请求并对正确的集合执行正确的操作。然后数据库函数将Promise返回给循环。我认为这是正确的做法。当承诺得到解决后,将触发下一次迭代。我相信这也应该是非阻塞的。
问题。在一堆插入和集合包含大约500k文档之后,更新开始失败。我想要更新的状态不会反映在数据库中。 mongo没有迹象表明操作未通过更改只是在数据库中。
数据库已正确编入索引,因此在我看来不应成为问题。 I / O负载非常高。在开发测试中,每秒大约有250次操作。在生产中,这个数字可能会大约200倍。
以下是我现在这样做的摘录:
Promise.mapSeries(testResults, (result) => {
if (result.test) {
// Save sequence results and status
if (result.test.testSequence) {
const coll = db.collection(collection);
// query = result.test.id;
// newValues = result.test;
const options = {
upsert: true,
w: 'majority', // Writeconcern
j: false,
wtimeout: 5000 // Timeout after 5 sec
};
return coll.updateOne(query, newValues, options);
}
else if(result.test.singleTest {
// Do pretty much the same as above
}
}
感谢意见:)