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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:31:05