如何在Mongoose中查询嵌套数组,获取指定名称的memList及内部元素
问题原因
memLists是数组类型,存储多个符合memListSchema的对象,你之前的写法将数组误作为带内置查询方法的对象调用,因此无法获取到预期结果。
方案1:已查询到user文档后,内存中操作
筛选指定名称的memList
使用数组find方法匹配目标列表:
// 替换为你要查找的列表名称 const targetListName = 'test list 1' const targetList = user.memLists.find(list => list.name === targetListName) // 打印列表名,可选链`?.`避免匹配不到时报错 console.log(targetList?.name) // 如需输出首字母大写的"Test List 1"格式,可以用以下写法 console.log(targetList?.name.replace(/^\w/, char => char.toUpperCase()))
访问内层items数据
同样用find匹配内层条目:
// 获取问题为"Question 1"的条目 const targetItem = targetList?.items?.find(item => item.question === 'Question 1') console.log(targetItem?.answer) // 输出"Answer 1"
向内层数组push数据
修改后调用save()方法持久化到数据库:
if (targetList) { // 推送新的mem条目 targetList.items.push({ question: "新问题", answer: "新答案", freq: 1 }) // 保存修改 await user.save() }
方案2:直接通过Mongoose查询更新(无需先查询完整user文档,性能更高)
如果只需要更新数据,不需要先读取列表内容,可以直接用Mongoose的数组更新语法:
const userId = '61a6ac0597698205f546634b' // 替换为目标用户ID const targetListName = 'test list 1' const newItem = { question: "新问题", answer: "新答案", freq: 1 } await User.updateOne( // 匹配条件:用户ID + 对应名称的memList { _id: userId, 'memLists.name': targetListName }, // $push 向数组插入数据,$占位符对应匹配到的memList下标 { $push: { 'memLists.$.items': newItem } } )
内容的提问来源于stack exchange,提问作者purpleovskoff
相关产品推荐
相关产品推荐

