Node.js+Mongoose如何通过ID数组删除MongoDB chats集合的内嵌rooms文档
你当前使用的deleteMany方法作用是删除集合中符合条件的整条chats文档,要删除内嵌的rooms数组中的匹配元素,需要使用updateMany配合$pull操作符实现,正确代码如下:
const idsRoom = [ '6138e21c145846ec1e38c5', '6138e2565c145846ec1e38c5', '6138e2b545c145846ec1e38c5', ]; const objectIdArray = idsRoom.map((s) => mongoose.Types.ObjectId(s)); Chat.updateMany( { 'rooms._id': { $in: objectIdArray } }, { $pull: { rooms: { _id: { $in: objectIdArray } } } , function (err, result) { if (err) { console.error('删除失败', err); return; } console.log(`成功修改${result.nModified}条chats文档,匹配的rooms内嵌文档已移除`); })
代码说明
updateMany用于批量更新所有符合条件的chats主文档,不会删除主文档本身$pull是MongoDB内置的数组更新操作符,会自动遍历数组删除所有符合匹配规则的元素- 两次使用
$in:第一层筛选出所有包含待删除room的chats文档,第二层指定要从rooms数组中移除的_id范围
如果使用更符合现代Node.js开发习惯的async/await写法,参考实现如下:
async function removeSpecifiedRooms(roomIds) { const objectIdArray = roomIds.map(id => mongoose.Types.ObjectId(id)); try { const updateRes = await Chat.updateMany( { 'rooms._id': { $in: objectIdArray } }, { $pull: { rooms: { _id: { $in: objectIdArray } } } ); console.log(`操作完成,共修改${updateRes.modifiedCount}条chats文档`); } catch (err) { console.error('操作失败:', err); } } // 调用方法 removeSpecifiedRooms([ '6138e21c145846ec1e38c5', '6138e2565c145846ec1e38c5', '6138e2b545c145846ec1e38c5' ]);
内容的提问来源于stack exchange,提问作者Ven Nilson
相关产品推荐
相关产品推荐

