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();