我的架构:
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 的输入
最佳答案
您的问题可能在 schemas.js
范围内。当通过文字定义对象时,this
不会引用正在定义的对象:
// ...
contact_info: [this.ContactInfo]
// ...
它将引用文字周围的上下文 - 在 Node 模块的情况下, exports
object -- 没有 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 = ...;
关于node.js - 在 Mongoose 中,如何在具有 .create()、.id() 和 .remove() 功能的模型中创建 MongooseArray/Collection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13956738/