如何从Mongoose查询返回的对象数组中获取name与ObjectId?
问题原因与解决方案
问题根源
Category.find()返回的是文档数组,不是单个对象。你直接访问categories.name和categories.creator会得到undefined,因为这些属性属于数组里的每一个元素,而非数组本身。
推荐解决方案:数据库层面直接查询(高效)
不要先拉取所有数据再在代码里判断,直接通过查询条件过滤,只检查是否存在匹配的条目:
方法1:使用findOne查询匹配文档
Category.findOne({ creator: req.userId, name: categoryName }) .select("-_id -__v") .then(existingCategory => { if (existingCategory) { // 存在匹配条目,执行save逻辑 note.save() .then(savedNote => { /* 处理保存结果 */ }) .catch(saveErr => { /* 处理保存错误 */ }); } else { // 无匹配条目,执行对应逻辑 } }) .catch(queryErr => { /* 处理数据库查询错误 */ });
方法2:使用exists直接判断存在性
如果只需要判断是否存在,不需要返回文档内容,用exists更轻量:
Category.exists({ creator: req.userId, name: categoryName }) .then(isExists => { if (isExists) { note.save() .then(savedNote => { /* 处理保存结果 */ }) .catch(saveErr => { /* 处理保存错误 */ }); } else { // 无匹配条目,执行对应逻辑 } }) .catch(queryErr => { /* 处理数据库查询错误 */ });
备选方案:遍历数组检查(不推荐,性能低)
如果必须先获取所有分类再判断,需要遍历数组,同时注意ObjectId与字符串的类型转换:
Category.find() .select("-_id -__v") .then(categories => { const creator = req.userId; // 检查数组中是否存在符合条件的元素 const hasMatchingEntry = categories.some(category => { // ObjectId转字符串后再和req.userId比较 return category.creator.toString() === creator && category.name === categoryName; }); if (hasMatchingEntry) { note.save() .then(savedNote => { /* 处理保存结果 */ }) .catch(saveErr => { /* 处理保存错误 */ }); } else { // 无匹配条目,执行对应逻辑 } }) .catch(queryErr => { /* 处理数据库查询错误 */ });
内容的提问来源于stack exchange,提问作者ReactNativeNoobie
相关产品推荐
相关产品推荐

