2017-08-24 2 views
0

J'utilise un couple de modèles un-à-plusieurs et je me demandais quel est l'avantage d'avoir à la fois un tableau de "enfants" ObjectID() et un ObjectID() du modèle "parent" dans l'enfant. Par exemple:mongoose-schema - les deux enfants array + ID du parent sont-ils nécessaires?

// a client will have a new card every ten visits 
var ClientSchema = new Schema({ 
    first_name: String, 
    last_name: String, 
    email: String, 
    cards: [] // ObjectID()s, <--- is this necessary? 
}); 

var CardSchema = new Schema({ 
    client: ObjectID(), // <--- or is this enough? 
    visits: [] 
}); 

Je pense que le client: ObjectID() devrait faire l'affaire dans la plupart des cas, en particulier avec les options de la population offre Mongoose.

Répondre

1

Il suffit de stocker la référence ObjectId dans l'un des documents.

Comme vous pouvez le lire dans la documentation ou dans this answer, le champ de référence nécessite un type et un ref. Le nom du champ est arbitraire. Une fois que vous avez fait cela et enregistré vos modèles, vous pouvez utiliser les modèles pour remplir vos requêtes.

var clientSchema = new Schema({ 
    first_name: String, 
    last_name: String, 
    email: String 
}); 

var cardSchema = new Schema({ 
    client: { 
     type: Schema.Types.ObjectId, 
     ref: 'client' 
    } 
}); 

// models 
var Card = mongoose.model('Card', cardSchema); 
var Client = mongoose.model('Client', clientSchema); 

Cependant, il peut être utile de stocker un tableau d'ObjectId. Cependant, cela crée également une énorme fenêtre pour les erreurs. Une discordance de clé étrangère et clé primaire, en dialecte SQL. Vous pouvez toujours faire une requête de compte si vous avez besoin de compter. Je dirais, faites ce soit ci-dessus ou faites ceci:

var clientSchema = new Schema({ 
    first_name: String, 
    last_name: String, 
    email: String, 
    cards: [ 
     { 
      type: Schema.Types.ObjectId, 
      ref: 'card' 
     } 
    ] 
}); 

var cardSchema = new Schema({ 
    card_name: String 
}); 

// models 
var Card = mongoose.model('Card', cardSchema); 
var Client = mongoose.model('Client', clientSchema); 
+1

Great! Merci @PimHeijden! Chaque exemple que j'ai rencontré utilise les deux, une idée pourquoi? Peut-être faire une seule requête et accéder à la longueur du tableau 'cards'? – brunouno

+1

merci! Je peux maintenant commenter. Ceci est mon premier commentaire XO –

+1

oui. D'ailleurs j'ai mis à jour l'anser –