いくつかのコレクションで2つまたは3つの異なる操作を実行する必要がある場合は、find/update
操作を連鎖させるよりも良い方法はありますか?たとえば、複数のMongoDB操作を行う正しい方法
db.collection('contactinfos').findOneAndUpdate(
{ _id: ObjectID(contactID) },
{ $set: { sharedWith } }
).then(response => {
db.collection('users').update(
{ _id: { $in: sharedWith.map(id => ObjectID(id)) } },
{ $addToSet: { hasAccessTo: contactID } },
{ multi: true }
).then(response => {
db.collection('users').update(
{ _id: { $in: notSharedWith.map(id => ObjectID(id)) } },
{ $pull: { hasAccessTo: contactID } },
{ multi: true }
).then(response => {
return res.send({ success: true });
}).catch(err => {
logger.error(`in updating sharing permissions for ${contactID} by user ${_id}`, err);
return res.status(400).send({ reason: 'unknown' });
});
}).catch(err => {
logger.error(`in updating sharing permissions for ${contactID} by user ${_id}`, err);
return res.status(400).send({ reason: 'unknown' });
});
}).catch(err => {
logger.error(`in updating sharing permissions for ${contactID} by user ${_id}`, err);
return res.status(400).send({ reason: 'unknown' });
});
ちょうど乱雑に思えますし、もっとやり方が必要です。さらに、他のupdate
が実行されないようにする最初のfindOneAndUpdate
の後にエラーがある場合、ドキュメント間で矛盾したデータが存在します。ドキュメントには、参照を高速化するために他のドキュメントへのID参照が含まれています。
また、一連の約束内のすべてのエラーをキャッチする方法はありますか?