Mongoose查询结果缺失parentId字段,如何为无该字段的记录补空值
方案1:调整Schema定义(最推荐,一劳永逸)
出现这个问题的核心原因是你的分类Schema中parentId字段没有设置默认值,历史存入的无父级分类的文档没有parentId字段,Mongoose查询时默认不会返回不存在的字段。
修改你的categoryModel对应的Schema代码,给parentId设置默认值为空字符串:
const categorySchema = new mongoose.Schema({ // 其余原有字段保持不变 parentId: { // 如果你的parentId存的是ObjectId类型,这里类型改为mongoose.Schema.Types.ObjectId type: String, default: "" }, title: String, slug: String })
修改后新增的分类会自动携带空字符串的parentId,已经存在的历史数据可以执行一次批量更新补全字段:
// 可单独执行一次该脚本补全历史数据 await categoryModel.updateMany( { parentId: { $exists: false } }, { $set: { parentId: "" } } )
修改完成后你原来的查询代码不需要调整,就可以返回符合预期的结果。
方案2:查询后手动处理结果(无需修改Schema和历史数据)
如果你不想改动现有Schema和库中已存的数据,可以在拿到查询结果后遍历补全缺失的parentId字段,修改你的路由代码如下:
router.get("/categoryFields", async (request, response) => { try { // 注意原代码把await写在try块外,查询报错时catch无法捕获,这里调整了位置 const rawCategories = await categoryModel.find({}).select("parentId title slug"); const categories = rawCategories.map(item => { const formatItem = item.toObject(); return { ...formatItem, parentId: formatItem.parentId ?? "" } }) response.send(categories); } catch (error) { response.status(500).send(error); } });
方案3:使用聚合查询直接生成目标格式(无需修改Schema,数据库层面处理)
也可以使用Mongoose的聚合能力,通过$ifNull操作符直接在查询时处理字段默认值:
router.get("/categoryFields", async (request, response) => { try { const categories = await categoryModel.aggregate([ { $project: { title: 1, slug: 1, parentId: { $ifNull: ["$parentId", ""] } } } ]) response.send(categories); } catch (error) { response.status(500).send(error); } });
内容的提问来源于stack exchange,提问作者Riddhish.Chaudhari
相关产品推荐
相关产品推荐

