子文档架构不起作用

时间:2017-01-11 03:09:26

标签: mongoose mongoose-schema

我正在尝试构建一个包含子文档的Mongoose Schema,因此我可以拥有一个包含用户信息及其联系人的文档。我们的想法是能够在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时,我收到一条错误说明:

TypeError:架构阵列路径contacts

的值无效

我对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'});
  })

})

2 个答案:

答案 0 :(得分:0)

在最新版本的Mongoose中我不认为[someSchema]是必要的。你可以把someSchema。所以没有数组括号。如果您使用的是旧版本,请尝试将.add与架构一起使用。就像这样。

var ContactSchema = new Schema(); ContactSchema.add({ contactFirstName:{ type : String, required: true }, contactLastName:{ type : String, required: true }, contactEmail: { type : String, required: true } })

将您的contacts:[ContactSchema]添加到UserSchema

答案 1 :(得分:0)

你走在正确的道路上,只是一个简单的错误。您在ContactSchema中使用了UserSchema而未对其进行定义,这就是为什么它未定义的原因。

在定义ContactSchema之前定义UserSchema,然后在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时,您没有将user.contacts定义为object,而是直接尝试将值分配给user.contacts.contactFirstNameuser.contacts.contactLastName。但是,由于未定义user.contact,因此它将undefined,因此error无法读取属性&#39; contactFirstName&#39;未定义的将会到来。

在为user.contacts = {};user.contacts.contactFirstName分配值之前添加user.contacts.contactLastName

user.contacts = {};//add this line
user.contacts.contactFirstName = req.body.contacts.contactFirstName;
user.contacts.contactLastName = req.body.contacts.contactLastName;