2015-11-17 4 views
1

A un haut niveau, je cherche à supprimer un document de Mongo ainsi que ses documents référencés. Jetez un oeil à schèmes exemple suivant:Suppression du document Mongo et de toutes ses références?

var studentSchema = mongoose.Schema({ 
    email: String, 
    name: String, 
    _class: { type: String, ref: 'Class' }, 
    books: [{ type: Schema.Types.ObjectId, ref: 'Book' }] 
}); 
module.exports = mongoose.model('Student', studentSchema); 


var classSchema = mongoose.Schema({ 
    gradeLevel: Number, 
    students: [{ type: Schema.Types.ObjectId, ref: 'Student' }] 
}); 
module.exports = mongoose.model('Class', classSchema); 


var bookSchema = mongoose.Schema({ 
    author: String, 
    subject: String, 
    pages: Number 
}); 
module.exports = mongoose.model('Book', bookSchema); 

Maintenant, ma question est double:
1. Si je veux .remove() un document de classe de ma base de données et tous les documents de l'élève fait référence à lui, Quelle est la meilleure façon de le faire? //currently looping through students with the given class id and individually removing, then finally removing the class document.
2. Si je veux .remove() un document de classe de la base de données AND tous les étudiants ET leurs livres, est-il un moyen de le faire simplement par le biais d'une instruction spéciale remove dans mongo? //Currently finding all students, removing their books, then remove themselves, then remove their referenced class.


Idéalement, je voudrais une déclaration le peut retirer un document mongo, et tout ce qui fait référence à lui, ainsi que tous les sous-références qui sous-document peut avoir. (e.g: Remove a Class and have mongo auto-remove all Students and their Books) Est-ce possible?

Répondre

1

Il n'existe aucune instruction qui fasse ce que vous voulez dans mongoDb ou mongoose. MongoDB n'est pas le meilleur choix si de telles opérations qui couvrent plusieurs collections sont très importantes pour votre application ("aucune jointure automatiquement prise en charge et intégrité référentielle dans MongoDB"). Vous pourriez également avoir besoin de modéliser vos données plus "mongo-like" pour réaliser ce que vous voulez.

Vous pouvez le faire plus efficacement que la boucle si vous avez des références arrières. La fonction retourne model.find() un objet de requête, qui a une méthode .remove(cb)

mongooose.model('Student').find({_class: myClassToRemove._id}).remove(function(err) {}); 

Pour vos livres cela ne fonctionnera pas, car Book n'a pas de référence à Student. Mais si vous ne partagez pas de livres entre différents étudiants, vous devez simplement stocker les livres dans l'objet étudiant en tant que «documents incorporés» au lieu d'utiliser un modèle et des références différents. Ensuite, ils seront supprimés automatiquement lorsque vous supprimez un étudiant. Si vous partagez une instance de livre entre plusieurs élèves, vous ne pouvez pas supprimer automatiquement le livre lorsque vous supprimez un élève, car vous ne savez pas si un autre élève utilise la même instance de livre.