Node.js操作MongoDB:校验父文档存在时{}使用报错求助
解决MongoDB查询对象构造语法错误及父文档存在校验需求
问题核心
你需要实现「仅当父文档存在时,才向MongoDB集合插入新文档」的逻辑,但构造查询对象时使用了错误的语法,导致SyntaxError报错。
错误原因分析
- 非法的对象字面量写法:你写的
\{ \}, \{ skill_category \}不是合法的JavaScript对象语法,对象需要键值对结构,不能直接用逗号分隔多个花括号。 - 错误的模板字符串用法:模板字符串不能直接作为对象字面量的内容,MongoDB驱动需要接收真实的JavaScript对象,而非字符串形式的对象。
- 异步方法误用:
collection.find()返回的是游标对象,不是布尔值,无法直接用if判断是否存在文档。
正确实现方案
使用标准的JavaScript对象作为查询条件,结合MongoDB异步方法的正确处理(async/await),实现父文档存在校验:
app.post("/addSkill", async function(request, response){ // 获取集合实例 const collection = db.collection("skills"); // 提取请求参数 const skill_category = request.body.skill_category; const skill_subcategory = request.body.skill_subcategory; const skill_name = request.body.skill_name; // 1. 检查是否存在对应分类的父文档 const categoryExists = await collection.findOne({ skill_category }); if(categoryExists){ console.log("已找到分类父文档"); // 2. 检查是否存在该分类下的子分类文档 const subcategoryExists = await collection.findOne({ skill_category, skill_subcategory }); if(subcategoryExists){ console.log("已找到子分类文档,执行插入操作"); // 插入新技能文档 await collection.insertOne({ skill_category, skill_subcategory, skill_name }); } else { console.log("未找到子分类文档"); } } else { console.log("未找到分类父文档"); } return response.redirect('/'); });
关键说明
- 查询对象规范:MongoDB查询条件是标准的键值对对象,比如
{ skill_category: skill_category }可简写为{ skill_category }(ES6属性简写语法)。 - 异步处理:用
async/await处理MongoDB的异步操作,findOne()会返回匹配的文档或null,可直接用于条件判断。 - 插入逻辑:仅当父文档(分类)和子文档(子分类)都存在时,才执行
insertOne()插入新的技能文档。
内容的提问来源于stack exchange,提问作者LautaroColella
相关产品推荐
相关产品推荐

