Mongoose查询结果count字段顺序与Schema设置不符问题求助
问题:Mongoose查询返回字段顺序不符合Schema定义
我的UserSchema定义如下:
let UserSchema = new Schema({ username: String, count: Number, log: [{ _id: false, description: String, duration: Number, date: String }], }, { versionKey: false }) let User = mongoose.model("User", UserSchema)
查询接口代码:
app.get('/api/users/:id?/logs', (req,res) => { var id = req.params.id User.find( {_id: id}, (err, result) => { if (err) throw err res.json(result) } ) })
实际返回结果示例:
[{"_id":"640cfc22471cdd96f98f9205","username":"test2","log":[{"description":"test3","duration":60,"date":"Mon Apr 03 2023"}],"count":1}]
可以看到count字段被排在最后,但我需要它位于username之后、log之前,调整Schema的字段顺序没有效果,求解决办法。
解决方案
方法一:查询时通过投影指定字段顺序
在User.find的第二个参数中,明确指定返回字段的顺序,MongoDB会按照你指定的顺序返回字段:
app.get('/api/users/:id?/logs', (req,res) => { var id = req.params.id // 第二个参数指定字段顺序:_id、username、count、log User.find( {_id: id}, '_id username count log', (err, result) => { if (err) throw err res.json(result) } ) })
这样返回的结果里,字段就会按照_id→username→count→log的顺序排列。
方法二:修改Schema的toJSON选项统一处理
在Schema的配置中添加toJSON的transform函数,每次转换为JSON时手动重组字段顺序,一劳永逸:
let UserSchema = new Schema({ username: String, count: Number, log: [{ _id: false, description: String, duration: Number, date: String }], }, { versionKey: false, toJSON: { transform: function(doc, ret) { // 按想要的顺序重组对象 return { _id: ret._id, username: ret.username, count: ret.count, log: ret.log }; } } }) let User = mongoose.model("User", UserSchema)
之后所有通过res.json返回的User文档,都会自动按这个顺序排列字段。
方法三:返回结果时手动重组对象
如果不想修改Schema或查询逻辑,可以在返回结果前,对每个查询到的文档手动构造新对象:
app.get('/api/users/:id?/logs', (req,res) => { var id = req.params.id User.find( {_id: id}, (err, result) => { if (err) throw err // 重组每个文档的字段顺序 const formattedResult = result.map(user => ({ _id: user._id, username: user.username, count: user.count, log: user.log })) res.json(formattedResult) } ) })
内容的提问来源于stack exchange,提问作者Aldo313
相关产品推荐
相关产品推荐

