在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
,所以它不会有id
, create
等方法。
你必须在对象之外定义你的模型来引用它们。 另请注意更改顺序:
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方法。
- Nodejs / rails / backbone架构
- 困惑于所有的Node JS框架/库等等
- 如何使用browserify捆绑骨干应用程序?
- Node.js和Backbone.marionette初始视图
- 错误:getaddrinfo ENOTFOUND在获取调用的nodejs中
- eonasdan-bootstrap-datetimepicker v4.17.37小部件不使用common.js加载
- Backbone.js和Node.js有什么区别? 哪个最好?
- ParseError:带有Browserify和模板文件的意外标记
- Backbone.js Node.js Express.js中的用户function