Mongoose中Schema关联问题:自定义列表items显示undefined
问题排查与解决方法
1. 先确认Schema定义是否正确
必须保证listSchema里的items字段明确是数组类型的itemSchema,别漏了数组括号:
const mongoose = require('mongoose'); // 定义itemSchema const itemSchema = new mongoose.Schema({ name: String }); // 定义listSchema,items必须用[]包裹itemSchema const listSchema = new mongoose.Schema({ name: String, items: [itemSchema] // 这里不能写成itemSchema,必须是数组形式 }); const List = mongoose.model('List', listSchema); const Item = mongoose.model('Item', itemSchema);
2. 创建文档时必须传对items字段
创建List实例的时候,得把defaultItems明确赋值给items属性,不然这个字段就是undefined:
// 构造默认的items数组 const defaultItems = [ new Item({ name: "Welcome!" }), new Item({ name: "Add items with +" }) ]; // 正确创建List,一定要传items const newList = new List({ name: "我的自定义列表", items: defaultItems }); // 别在save外面直接log,要等保存完成再看 newList.save() .then(savedList => { console.log(savedList.items); // 这里就能正常显示items数组了 }) .catch(err => console.log(err));
注意:mongoose的save是异步操作,如果你在save()外面直接打印newList.items,可能因为还没完成文档初始化导致显示undefined,必须在回调或者async/await里看保存后的结果。
3. 给items加默认值(可选)
如果希望创建List时不用手动传items也能有默认内容,可以在Schema里设置default:
const listSchema = new mongoose.Schema({ name: String, items: { type: [itemSchema], default: () => defaultItems // 直接绑定默认数组 } });
这样只传name创建List,items会自动用上默认值:
const newList = new List({ name: "默认列表" }); newList.save().then(savedList => console.log(savedList.items));
4. 检查字段名拼写
别把字段名写错了,比如写成item而不是items,mongoose对字段名大小写和拼写是严格要求的。
5. 重新查库验证
要是保存后还是看不到,直接从数据库里查一遍确认:
List.findOne({ name: "我的自定义列表" }) .then(foundList => { console.log(foundList.items); // 直接拿数据库里的最新数据 }) .catch(err => console.log(err));
内容的提问来源于stack exchange,提问作者vasanth rv
相关产品推荐
相关产品推荐

