1

私のスキーマ:

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から入力を受け取っています

4

2 に答える 2

1

問題は内にある可能性がありますschemas.js。リテラルでオブジェクトを定義する場合、this定義されているオブジェクトを参照しません。

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

代わりに、プロパティを持たないリテラル(ノードモジュールの場合は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 = ...;
于 2012-12-19T17:06:00.303 に答える
1

どうやら私はいくつか間違ったことをしました:

スキーマでは、モデルではなく他のスキーマを参照します。

良い:

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 = new Schema({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);

もう1つは、次のことを実行しても何も保存されないことです!!!

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

あなたもしなければなりません

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

ここに興味がある人のために、私がAccountとContactInfo用に作成したCRUDメソッドがあります。

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

于 2012-12-19T19:04:45.813 に答える