MongoDB查询返回数组而非对象的问题解决请求
解决MongoDB返回数组转对象格式的问题
问题背景
我有两种获取题目数据的方式:
- 方案一:将本地JSON文件导入MongoDB,通过接口查询返回数据,当前返回的
data是数组格式 - 方案二:直接读取本地JSON文件返回,
data是符合预期的对象格式
需要将方案一的返回结果修改为对象格式,相关代码及JSON结构如下:
方案一代码
数据导入部分
//IMPORTING TO DATABASE const questions = JSON.parse( fs.readFileSync(`${__dirname}/questions.json`, "utf-8") ); const importData = async () => { try { await Questions.create(questions); console.log("Data successfully loaded!"); } catch (err) { console.log(err); } process.exit(); };
Model定义
//MODEL const mongoose = require("mongoose"); const questionsSchema = new mongoose.Schema({ beginner: [ { questionText: String, answerOptions: Array, }, ], intermediate: [ { questionText: String, answerOptions: Array, }, ], advanced: [ { questionText: String, answerOptions: Array, }, ], });
接口响应部分
// RESPONSE const getAllQuestions = async (req, res, next) => { try { const data = await Questions.find(); res.status(200).json({ status: "success", data, }); } catch (err) { res.status(500).json({ status: "fail", message: err, }); } next(); };
JSON结构
{ "beginner": [...], "intermediate": [...], "advanced": [...], }
方案二代码
const fs = require("fs"); const dataPath = require("path").resolve(__dirname, "../data/questions.json"); const data = JSON.parse(fs.readFileSync(dataPath)); exports.getAllQuestions = async (req, res, next) => { try { res.status(200).json({ status: "success", data, }); } catch (err) { res.status(500).json({ status: "fail", message: err, }); } next(); };
解决方案
问题出在接口响应的查询逻辑:Questions.find()会返回集合中所有文档组成的数组,而我们只需要存储的那一份题目数据对象。可以通过两种方式修改:
方式1:使用findOne()查询单个文档
直接查询集合中的第一个文档(因为我们只导入了一份数据):
// 修改后的RESPONSE代码 const getAllQuestions = async (req, res, next) => { try { const data = await Questions.findOne(); res.status(200).json({ status: "success", data, }); } catch (err) { res.status(500).json({ status: "fail", message: err, }); } next(); };
方式2:从find()返回的数组中提取第一个元素
如果需要保留find()查询(比如后续可能有多个文档场景),可以手动取数组的第一个元素:
// 修改后的RESPONSE代码 const getAllQuestions = async (req, res, next) => { try { const dataArray = await Questions.find(); const data = dataArray[0]; res.status(200).json({ status: "success", data, }); } catch (err) { res.status(500).json({ status: "fail", message: err, }); } next(); };
额外验证
确保数据导入逻辑正确:Questions.create(questions)会将整个JSON对象作为单个文档插入集合,这和Schema定义匹配。如果之前导入错误导致集合中有多个重复文档,建议先清空集合后重新执行导入脚本。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

