在Mongoose中,如何在具有.create(),.id()和.remove()function的模型中创buildMongooseArray / Collection

我的模式:

Account: mongoose.model('Account', new Schema({ account_name: String, company: String, notes: String, contact_info: [this.ContactInfo] })), ContactInfo: mongoose.model('ContactInfo', new Schema({ name: String, email: String, phone: String, notes: String })) 

当我尝试对contact_info做任何操作时,它说方法不存在。

 var c = new ContactInfo...); var a = new Account(...); a.contact_info.create(c); //error, create doesn't exsit a.contact_info.push(c); //works a.contact_info.id(...).remove(); //id doesn't exist 

难道我做错了什么?

我的完整代码在这里(不是太多): https : //github.com/nycitt/node-survey-builder-api-server/blob/master/accounts.js

顺便说一下,我从Backbone.js接收input

你的问题可能在schemas.js 。 当通过文字定义对象时, this不会引用被定义的对象:

 // ... contact_info: [this.ContactInfo] // ... 

它将引用周围文本的上下文 – 在Node模块的情况下, exports对象 – 它没有ContactInfo属性。 所以结果是:

 // ... contact_info: [undefined] // ... 

你仍然会有一个Array ,这就是为什么push是可用的。 但是,Mongoose不知道把它做成一个MongooseDocumentArray ,所以它不会有idcreate等方法。

你必须在对象之外定义你的模型来引用它们。 另请注意更改顺序:

 var ContactInfo = mongoose.model('ContactInfo', new Schema({ // ... }); var Account = mongoose.model('Account', new Schema({ // ... contact_info: [ContactInfo] }); module.exports = { Account: Account, ContactInfo: ContactInfo }; 

或者,将它们附加到exports这样this.ContactInfo被设置(相同的顺序):

 exports.ContactInfo = ...; exports.Account = ...; 

所以显然我做了一些错误的事情:

在Schema中,引用其他Schemas NOT Models:

好:

 var ContactInfoSchema = new Schema({ name: String }); var AccountSchema = new Schema({ account_name: String, contact_info: [ContactInfoSchema] }); var ContactInfo = mongoose.model('ContactInfo', ContactInfoSchema); var Account = mongoose.model('Account', AccountSchema); 

错误:var ContactInfoSchema =新架构({name:String,email:String,phone:String,notes:String});

 var AccountSchema = new Schema({ account_name: String, contact_info: [ContactInfo] //subtle difference }); var ContactInfo = mongoose.model('ContactInfo', ContactInfoSchema); var Account = mongoose.model('Account', AccountSchema); 

另一件事是做下面不保存任何东西!

 account.contact_info.create(params); account.save(); 

你也必须这样做

 var c = account.contact_info.create(params); account.contact_info.push(c); account.save(); 

对于那些感兴趣的是我为Account和ContactInfo创build的CRUD方法。

https://github.com/nycitt/node-survey-builder-api-server/blob/f94fcd4b05bf0af4f34a0e00f4ff79ebf64e24e1/accounts.js