Node.js 在Mongoose中,如何在具有.create()、.id()和.remove()功能的模型中创建MongoosArray/集合
我的模式:Node.js 在Mongoose中,如何在具有.create()、.id()和.remove()功能的模型中创建MongoosArray/集合,node.js,mongodb,backbone.js,mongoose,Node.js,Mongodb,Backbone.js,Mongoose,我的模式: 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: Str
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
}))
但当我尝试对联系人信息执行任何操作时,它会说这些方法不存在
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
我做错什么了吗
我的完整代码在这里(不太多):
顺便说一句,我收到了Backbone.js的输入,您的问题可能在。按文字定义对象时,此
不会引用正在定义的对象:
// ...
contact_info: [this.ContactInfo]
// ...
相反,它将引用文本周围的上下文——在节点模块的情况下,它没有ContactInfo
属性。因此,结果是:
// ...
contact_info: [undefined]
// ...
您仍然有一个数组
,这就是为什么推送
可用的原因。但是,Mongoose不知道如何使其成为一个,因此它没有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
};
或者,将它们附加到导出中,以便设置联系人信息(顺序相同):
所以很明显我做错了几件事: 在模式中,引用其他模式而不是模型: 好: 坏的: var ContactInfoSchema=新模式({ 名称:String, 电子邮件:String, 电话:String, 注:字符串 }); 另一件事是,执行以下操作不会保存任何内容
account.contact_info.create(params);
account.save();
你也必须这样做
var c = account.contact_info.create(params);
account.contact_info.push(c);
account.save();
对于那些感兴趣的人,这里是我为Account和ContactInfo创建的CRUD方法
尝试过(在回购中推动)。不幸的是,我还是一样error@AnatoliyZaslavskiy可能需要参考
模式
,而不是模型
:。试试联系人信息:[ContactInfo.schema]
()。现在我遇到了一个非常奇怪的问题。create()有效(无错误)。事实上,它甚至还给我刚刚创建的联系人一个ID。但是,当我查看数据库时,没有任何内容(空数组),当我执行a.contact_info.id(id)时,它返回null。你认为我刚刚创建的联系信息发生了什么变化?(repo中更新的源代码)@AnatoliyZaslavskiy该方法似乎不会改变调用数组的情况(请参阅“显示代码”)。它只是创建实例,类似于子文档类型的newcontactinfo(…)
。因此,按照create
使用a.contact\u info.push(c)代码>。谢谢乔纳森!成功了!我想知道为什么.create不能为您执行.push()(就像在主干中一样)。看起来很直观。。。
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();