如何在MongoDB(Mongoose)中向指定文件夹的files数组推送文件对象?
问题描述
我定义了如下Mongoose Schema:
const UserSchema = new mongoose.Schema({ mail: { type: String, required: true }, password: { type: String, required: true }, folders: [ { folderName: { type: String, default: 'Main', required: true, }, files: [ { fileName: String, fileType: String, date: String, filePath: String, } ] } ] });
我需要从请求中获取用户邮箱和文件夹名称,将文件数据添加到对应文件夹的files数组中。目前我能通过先查询用户、再修改数组、最后保存的方式实现,但希望直接用MongoDB的updateOne操作完成。
当前的非updateOne实现逻辑:
const mail = req.body.mail; const folderName = req.body.folderName; const file = { fileName: 'file222', fileType: '.png', date: '13-02-2022 21:15', filePath: '/uploads', } const user = await userModel.findOne({ mail: mail }); const folders = user.folders.filter(folder => folder.folderName === folderName); folders[0].files.push(file); await user.save();
我尝试的updateOne写法无法正确实现需求,不知道如何指定查询条件和更新操作:
const userFile = await userModel.updateOne( { mail: mail, "folders.folderName": folderName }, { $push: { folders: { files: file } } } );
请问正确的实现方式是什么?
正确实现方式
要给指定用户的指定文件夹添加文件,需要使用MongoDB的数组定位操作符$,它会匹配查询条件中第一个符合的数组元素,然后针对该元素执行更新操作。
正确的updateOne代码如下:
const mail = req.body.mail; const folderName = req.body.folderName; const file = { fileName: 'file222', fileType: '.png', date: '13-02-2022 21:15', filePath: '/uploads', }; const updateResult = await userModel.updateOne( // 查询条件:匹配目标邮箱的用户,且该用户包含指定名称的文件夹 { mail: mail, "folders.folderName": folderName }, // 更新操作:用$定位符找到匹配的文件夹,将新文件push到它的files数组 { $push: { "folders.$.files": file } } ); // 可通过返回结果判断更新状态 console.log(`匹配到${updateResult.matchedCount}条数据,更新了${updateResult.modifiedCount}条数据`);
核心要点:
- 查询条件中的
"folders.folderName": folderName用于筛选出包含目标文件夹的用户 - 更新操作里的
"folders.$.files"中,$作为数组定位符,会指向查询条件匹配到的第一个folders元素(即目标文件夹),确保新文件被添加到正确的files数组中 - 如果需要支持大小写不敏感的文件夹名称匹配,可以修改查询条件为:
"folders.folderName": { $regex: folderName, $options: 'i' }
内容的提问来源于stack exchange,提问作者Kondi
相关产品推荐
相关产品推荐

