2012-12-19 4 views
1

Mes MongooseArray Schemas/Collection dans un modèle qui a .Create(), .id(), et .remove():Mongoose comment puis-je créer une fonctionnalité

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 
})) 

Lorsque je tente de faire tout actions sur contact_info cependant, il dit que les méthodes n'existent pas.

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 

Est-ce que je fais quelque chose de mal?

Mon code complet est ici (pas trop de celui-ci): https://github.com/nycitt/node-survey-builder-api-server/blob/master/accounts.js

Je reçois l'entrée de Backbone.js par la façon dont

Répondre

1

Votre problème peut être dans schemas.js. Lors de la définition d'un objet par littéral, this ne renverra pas à l'objet défini:

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

Il va plutôt se référer au contexte entourant le littéral - dans le cas des modules nœud, le exports object - qui n'a pas de propriété ContactInfo. Ainsi, le résultat est:

// ... 
    contact_info: [undefined] 
// ... 

Vous aurez encore un Array, ce qui explique pourquoi push est disponible. Mais, Mongoose ne sait pas en faire un MongooseDocumentArray, donc il n'aura pas les méthodes id, create, etc.

Vous devrez définir vos modèles en dehors de l'objet pour y faire référence. A noter également le changement dans l'ordre:

var ContactInfo = mongoose.model('ContactInfo', new Schema({ 
    // ... 
}); 

var Account = mongoose.model('Account', new Schema({ 
    // ... 
    contact_info: [ContactInfo] 
}); 

module.exports = { 
    Account: Account, 
    ContactInfo: ContactInfo 
}; 

Ou, les attacher à exports si this.ContactInfo est définie (même ordre):

exports.ContactInfo = ...; 
exports.Account = ...; 
+0

Essayé cela (repoussé). Malheureusement, je reçois toujours la même erreur –

+0

@AnatoliyZaslavskiy La référence peut être à la 'Schema' plutôt que le' Model': http://mongoosejs.com/docs/subdocs.html. Essayez 'contact_info: [ContactInfo.schema]' ([ref] (http://mongoosejs.com/docs/api.html#model_Model-schema)) à la place. –

+0

Maintenant, j'ai un problème vraiment étrange. .create() fonctionne (aucune erreur). En fait, il crache même un identifiant pour le contact que je viens de créer. Cependant, quand je regarde dans ma base de données, rien n'est là (tableau vide), et quand je fais un.contact_info.id (ID) il renvoie null. Que pensez-vous qu'il se passe à l'information de contact que je viens de créer? (Source mise à jour dans repo) https://github.com/nycitt/node-survey-builder-api-server/blob/master/accounts.js#L108 –

0

Donc, apparemment, je l'ai fait quelques mauvaises choses:

En Schémas, référence autres schémas PAS Modèles:

Bon:

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

Bad: var ContactInfoSchema = new schéma ({ name: String, email: String, télé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); 

L'autre chose est de faire ce qui suit ne sauve rien!

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

Vous devez également faire

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

Pour les personnes intéressées ici sont les méthodes CRUD j'ai créé pour compte et ContactInfo.

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

Questions connexes