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

Mongoose:定义文档与数据库名称不同的Schema属性方法

在Mongoose中实现仅保留别名的字段映射

可以通过Mongoose的Schema配置实现文档对象与数据库字段名的映射,且仅对外暴露别名,具体方案如下:

核心实现:alias + select: false

为每个模型的状态时间字段配置别名enteredIntoStatusOn,同时将数据库原字段设置为select: false,隐藏原字段的暴露,只保留别名在文档对象中。

示例代码

以TraineeSchema为例,其他模型同理:

const TraineeSchema = new Schema({
  // 其他字段...
  acceptedOn: {
    type: Date,
    alias: 'enteredIntoStatusOn', // 文档对象中使用的别名
    select: false // 隐藏数据库原字段,查询时不返回
  }
});

这样操作文档时的效果:

  • 设置文档的enteredIntoStatusOn,Mongoose会自动将值存储到数据库的acceptedOn字段
  • 查询返回的文档对象中,只会存在enteredIntoStatusOn,不会出现原字段acceptedOn
  • 更新操作使用别名enteredIntoStatusOn即可,Mongoose会自动映射到数据库原字段

聚合操作的统一处理

由于聚合操作直接操作数据库中的原始字段名,若想统一使用别名enteredIntoStatusOn过滤,需要在聚合管道开头添加$project阶段完成字段映射:

Trainee.aggregate([
  {
    $project: {
      // 保留需要的其他字段,用1表示保留
      name: 1,
      department: 1,
      // 将数据库原字段映射为别名
      enteredIntoStatusOn: '$acceptedOn'
    }
  },
  {
    $match: { enteredIntoStatusOn: { $gt: new Date('2023-01-01') } }
  }
]);

简化重复代码:通用字段片段

如果多个模型都需要这个逻辑,可以封装通用的Schema片段,避免重复编写:

// 通用状态时间字段生成函数
const createStatusTimeField = (dbFieldName) => ({
  [dbFieldName]: {
    type: Date,
    alias: 'enteredIntoStatusOn',
    select: false
  }
});

// 在各模型中调用
const TraineeSchema = new Schema({
  ...createStatusTimeField('acceptedOn'),
  // 其他字段...
});

const EmployeeSchema = new Schema({
  ...createStatusTimeField('hiredOn'),
  // 其他字段...
});

注意事项

  • 若特殊场景需要临时获取原字段,可以在查询时显式指定select: '+acceptedOn'(+表示强制返回隐藏字段)
  • 所有CRUD操作均可直接使用别名,Mongoose会自动处理与数据库字段的映射

内容的提问来源于stack exchange,提问作者user2921009

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:39:19