You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:32:31