Plusieurs-à-plusieurs avec cartographie de la Mangouste
J'ai FlashcardSchemas et PackageSchemas dans mon design. Une carte mémoire peut appartenir à différents packages et un package peut contenir différentes cartes mémoire.
Ci-dessous vous pouvez voir une version allégée de mon mangouste définitions de schéma:
//package-schema.js
var Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;
var PackageSchema = new Schema({
id : ObjectId,
title : { type: String, required: true },
flashcards : [ FlashcardSchema ]
});
var exports = module.exports = mongoose.model('Package', PackageSchema);
//flashcard-schema.js
var Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;
var FlashcardSchema = new Schema({
id : ObjectId,
type : { type: String, default: '' },
story : { type: String, default: '' },
packages : [ PackageSchema ]
});
var exports = module.exports = mongoose.model('Flashcard', FlashcardSchema);
Comme vous pouvez le voir dans les commentaires ci-dessus, ces deux définitions de schéma appartiennent à des fichiers séparés et font référence les uns aux autres.
J'obtiens une exception indiquant que PackageSchema n'est pas défini, comme prévu. Comment puis-je carte un plusieurs-à-plusieurs relation avec mangouste?
- Il n'y a pas de façon simple de le faire - pourquoi êtes-vous en avoir des paquets de la partie de la carte mémoire de schéma, et flashcards partie de l'ensemble du schéma? quelles sont les requêtes vous attendez-vous courir?
- Quand je tire un paquet de la db, je veux remplir les cartes de tableau et quand je tire une carte de la db, je veux voir les paquets que la carte appartient. Si il n'y a pas de moyen simple pour ce faire, dois-je utiliser un troisième schéma de fonction pour stocker ces relations?
- Il y a une plus récente et complète réponse ici: stackoverflow.com/a/46020968/438970
Vous devez vous connecter pour publier un commentaire.
Que vous faites de la bonne façon, cependant le problème est que vous devez inclure PackageSchema dans le flashcard-schema.js et vice-versa. Sinon, ces fichiers ont aucune idée de ce que vous faites référence à
Je suis nouveau sur le nœud, mongoDB, et de la mangouste, mais je pense que la bonne façon de le faire est:
De cette façon, vous gardez uniquement la référence de l'objet et non pas un objet incorporé.
ref:'Flashcard'
etref:'Package'
sur cette réponse censée correspondre le nom du Schéma, ou est-il arbitraire? En d'autres termes, doit-il êtreFlashcardSchema
?It is debatable that we really want two sets of pointers as they may get out of sync. Instead we could skip populating and directly find() the stories we are interested in.
Cela me fait penser qu'il devrait y avoir un seul ref tableau sur l'un des schémas. Si vous avez des ref tableaux dans les deux schémas, vous voulez vous assurer que enregistrer les cartes avec des packages OU des paquets avec des cartes. Je ne suis pas expert sur la Mangouste si.Vous pouvez utiliser le Schéma.méthode add() pour éviter les avant de référencement de problème.
Ce (non testé) solution met le schéma dans un .fichier js
models/index.js
Vous pensez que c'est trop comme un magasin de données relationnelles. Si c'est ce que vous voulez, utilisez MySQL (ou un autre SGBDR)
À défaut, alors oui, un troisième schéma pourrait être utilisé, mais n'oublie pas que ça va encore être uniquement l'id de chaque objet (pas de joint, rappelez-vous), de sorte que vous aurez toujours à récupérer chaque autre élément dans une requête distincte.
C'est le problème de cyclique/dépendance circulaire. C'est une façon de le faire fonctionner en nodejs. Pour plus de détails, consultez "Cyclique des dépendances dans CommonJS" à http://exploringjs.com/es6/ch_modules.html#sec_modules-in-javascript
JS: