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
相关产品推荐
相关产品推荐

