Mongoose 子文档架构不工作

Mongoose 子文档架构不工作,mongoose,mongoose-schema,Mongoose,Mongoose Schema,我正在尝试构建一个包含子文档的Mongoose模式,这样我就可以拥有一个包含用户信息及其联系人的文档。其思想是能够在Contacts子文档上具有CRUD功能,而不需要单独的集合 (很抱歉说出了显而易见的事实,我只是想澄清一下) 所以父模式是“用户”,子模式是“联系人” 我将我的模型编码如下: var UserSchema = new Schema({ login: { type: String, unique: true, required

我正在尝试构建一个包含子文档的Mongoose模式,这样我就可以拥有一个包含用户信息及其联系人的文档。其思想是能够在Contacts子文档上具有CRUD功能,而不需要单独的集合

(很抱歉说出了显而易见的事实,我只是想澄清一下)

所以父模式是“用户”,子模式是“联系人”

我将我的模型编码如下:

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做什么,我的意思是您正在测试哪条路由?你能发布你正在测试的路由代码吗?嗨,拉维,我在上面添加了一个示例路由。