如何让Mongoose返回的响应数据按定义的Schema字段顺序排序
Mongoose返回数据按指定字段顺序排列的实现方案
不需要零散手动逐个赋值,有两种更规范、易维护的通用实现方式:
方案1:Schema全局配置toJSON转换(推荐)
该方案属于Schema层统一配置,所有使用该Schema的接口都会自动按指定顺序返回字段,无需每个接口单独处理:
const RoleModel = new Schema({ name : { // 保留你原来的字段配置 }, description:{ // 保留你原来的字段配置 }, permission:{ // 保留你原来的字段配置 } },{ timestamps: false, // 新增toJSON转换配置 toJSON: { transform: (doc, ret) => { // 按你需要的顺序重构返回对象 return { _id: ret._id, name: ret.name, // 不需要description的话可以删掉该行 description: ret.description, permission: ret.permission, __v: ret.__v } } } })
接口返回时调用文档实例的toJSON()方法即可:
const roles = await RoleModel.find() res.json({ message: "Displaying data", data: roles.map(item => item.toJSON()) })
方案2:lean查询后解构重构
适合仅单个接口需要自定义顺序、不想影响全局Schema配置的场景,搭配lean()查询(返回纯JS对象,性能更高)使用:
// 带lean()的查询返回纯JS对象,没有Mongoose文档实例的额外方法 const roles = await RoleModel.find().lean() // 按指定顺序解构后重构对象 const sortedRoles = roles.map(({ _id, name, description, permission, __v }) => ({ _id, name, // 不需要description的话可以删掉该行 description, permission, __v })) res.json({ message: "Displaying data", data: sortedRoles })
注意事项
- MongoDB本身存储文档时不保证字段顺序,因此必须在应用层做转换,不要依赖数据库返回的原始字段顺序
- 不需要返回的字段直接在重构对象时删除对应键即可,无需额外处理
内容的提问来源于stack exchange,提问作者shev anto
相关产品推荐
相关产品推荐

