mongoose 如何在mongodb中进行批量更新和删除操作?

0ve6wy6x  于 2023-01-09  发布在  Go
关注(0)|答案(1)|浏览(205)

我正在建立一个任务管理应用程序,只有管理员可以删除用户。当管理员删除一个用户,我想分配删除用户的任务给他的assignby用户。

{
  _id: new ObjectId("63bad43ee5d01d4cc13d58b2"),
  title: 'Test task',
  completed: false,
  urgent: false,
  assignedBy: new ObjectId("63afc89d7e3da6e5d996d415"), // ex: john
  asignTo: new ObjectId("63bac632f2f1830832d229a4"), // ex: devid
  __v: 0
}

当我从数据库中删除devid用户时,我想将他的任务分配给john并保存该任务

{
  _id: new ObjectId("63bad43ee5d01d4cc13d58b2"),
  title: 'Test task',
  completed: false,
  urgent: false,
  assignedBy: new ObjectId("63afc89d7e3da6e5d996d415"), // ex: john
  asignTo: new ObjectId("63afc89d7e3da6e5d996d415"), // ex: john
  __v: 0
}
yc0p9oo0

yc0p9oo01#

我认为您正在寻找transactions,以避免丢失数据。
所以你可以尝试一些类似的东西(不是真实的的代码):

const updateAndDelete = async (userToRemove) => {
    const session = await db.startSession()
    try {
        session.startTransaction();
        const user = await User.findById(userToRemove, {session: session})
        const {assignedBy} = user
        await user.remove({session: session})
        await Task.updateMany({asignTo: userToRemove}, {asignTo: assignedBy}, {session: session})
        await session.commitTransaction();
    } catch(e) {
        await session.abortTransaction();
    }
    session.endSession();
}

如果一切正常,提交事务并保存所有更改(如果需要,也可以添加一些if并抛出异常),否则可以回滚,不会丢失任何数据。

相关问题