Mongoose 子文档架构不工作
我正在尝试构建一个包含子文档的Mongoose模式,这样我就可以拥有一个包含用户信息及其联系人的文档。其思想是能够在Contacts子文档上具有CRUD功能,而不需要单独的集合 (很抱歉说出了显而易见的事实,我只是想澄清一下) 所以父模式是“用户”,子模式是“联系人” 我将我的模型编码如下:Mongoose 子文档架构不工作,mongoose,mongoose-schema,Mongoose,Mongoose Schema,我正在尝试构建一个包含子文档的Mongoose模式,这样我就可以拥有一个包含用户信息及其联系人的文档。其思想是能够在Contacts子文档上具有CRUD功能,而不需要单独的集合 (很抱歉说出了显而易见的事实,我只是想澄清一下) 所以父模式是“用户”,子模式是“联系人” 我将我的模型编码如下: var UserSchema = new Schema({ login: { type: String, unique: true, required
var UserSchema = new Schema({
login: {
type: String,
unique: true,
required: true
},
password: {
type: String,
required: true
},
email:{
type: String,
required: true
},
firstname:{
type: String,
required: false
},
lastname: {
type: String,
required: false
},
contacts:[ContactSchema]
})
var ContactSchema = new Schema({
contactFirstName:{
type: String,
required: true
},
contactLastName:{
type: String,
required: true
},
contactEmail: {
type: String,
required: true
}
})
但当我运行API时,会出现一个错误,说明:
类型错误:架构数组路径联系人的值无效
我对Mongoose相当陌生,但从我所看到的来看,这就是实现子文档的方式
有人能看到我遗漏了什么吗
下面是我想在Express API中调用的示例路由:
router.route('/')
//CREATE NEW USER
.post(function(req, res){
var user = new User();
user.login = req.body.login;
user.firstname = req.body.firstname;
user.lastname = req.body.lastname;
user.email = req.body.email;
user.password = req.body.password;
user.contacts.contactFirstName = req.body.contacts.contactFirstName;
user.contacts.contactLastName = req.body.contacts.contactLastName;
user.save(function(err){
if(err)
res.send(err);
res.json({message:'User has been created'});
})
})
在Mongoose的最新版本中,我认为没有必要使用[someSchema]。你可以放一些模式。所以没有数组括号。如果您使用的是较旧的版本,请尝试使用.add和架构。像这样
var ContactSchema=newschema();
ContactSchema.add({
contactFirstName:{
类型:字符串,
必填项:true
},
联系人姓氏:{
类型:字符串,
必填项:true
},
联系电子邮件:{
类型:字符串,
必填项:true
}
})
然后将您的联系人:[ContactSchema]
添加到UserSchema您的路径是正确的,只是一个简单的错误。您在UserSchema
中使用了ContactSchema
,但没有对其进行定义,这就是它未定义的原因
在定义UserSchema
之前定义您的ContactSchema
,然后在contacts数组中使用它。它应该很好用
var UserSchema = new Schema({
//rest of the variables...
lastname: {
type: String,
required: false
},
contacts:[ContactSchema]
})
var ContactSchema = new Schema({
contactFirstName:{
type: String,
required: true
},
//other variables...
});
更新:
创建新的用户
时,您没有将用户.联系人
定义为对象
,而是直接尝试将值分配给用户.联系人.联系人名
和用户.联系人.联系人名
。但是,由于user.contact未定义,因此它将作为未定义的
,因此错误
:无法读取未定义的的属性“contactFirstName”
添加user.contacts={}代码>将值分配给用户.contacts.contactFirstName
和用户.contacts.contactLastName
之前
user.contacts = {};//add this line
user.contacts.contactFirstName = req.body.contacts.contactFirstName;
user.contacts.contactLastName = req.body.contacts.contactLastName;
谢谢@mrtaz。我试着删除括号并在(contacts:contactSchema)之后直接调用var,但得到了相同的错误。我正在使用mongoose 4.5.5。在UserThank Ravi上面添加联系人模式!在《邮递员》中测试这一点的最佳方法是什么?谢谢Ravi。我改变了它们,在运行API时没有出现这种错误。但是,当我尝试在PostMan中进行测试时,我尝试使用“contacts.contactFirstName”键添加其中一个字段,并收到一条未定义的消息:“error:“无法读取未定义的”属性“contactFirstName”。您试图对PostMan做什么,我的意思是您正在测试哪条路由?你能发布你正在测试的路由代码吗?嗨,拉维,我在上面添加了一个示例路由。