javascript - 删除 Mongo 文档及其所有引用?

标签 javascript mongodb reference mongoose

在较高层面上,我希望从 Mongo 中删除文档及其引用的文档。看一下以下示例架构:

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

现在,我的问题有两个:
1. 如果我想从数据库中 .remove() 一个类文档以及引用它的所有学生文档,最好的方法是什么? //当前循环遍历具有给定类(class) ID 的学生并单独删除,最后删除类(class)文档。
2.如果我想从数据库和所有学生及其书籍中 .remove() 一个类(class)文档,有没有办法通过 mongo 中的特殊删除语句来简单地做到这一点? //当前找到所有学生,删除他们的书本,然后删除自己,然后删除他们引用的类(class)。


理想情况下,我想要一个可以删除 mongo 文档以及引用它的任何内容以及子文档可能具有的任何子引用的声明。 (例如:删除类(class)并让 mongo 自动删除所有学生及其书籍) 这可能吗?

最佳答案

在 mongoDb 或 mongoose 中没有任何语句可以执行您想要的操作。如果此类跨越多个集合的操作对于您的应用程序非常重要(“MongoDB 中没有自动支持的联接和引用完整性”),那么 MongoDB 不是最佳选择。您可能还需要对数据进行更“类似 mongo”的建模才能实现您想要的效果。

如果有反向引用,您可以比循环更有效地完成此操作。 model.find() 函数返回一个查询对象,该对象具有 .remove(cb) 方法

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

对于您的书籍,这不起作用,因为 Book 没有对 Student 的引用。但是,如果您不在不同的学生之间共享书籍,那么您应该将书籍作为“嵌入文档”存储在学生对象中,而不是使用不同的模型和引用。然后,当您删除学生时,它们将被自动删除。

如果您确实在多个学生之间共享一本图书实例,则在删除学生时无法自动删除该图书,因为您不知道其他学生是否使用同一图书实例。

关于javascript - 删除 Mongo 文档及其所有引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33764935/

相关文章:

javascript - 无法解析来自服务器的 Cakephp Jquery Datatable JSON 数据

javascript - Mongoose 在填充后使用 where

javascript - javascript(toFixed)方法有什么问题?

javascript - 如何防止 IE8 加载 javascript 库

mongodb - 如何知道MongoDB集合大小?

json - 从二进制转换为字符串,然后查询 int 值

java - 将一个类实例传递给另一个类

matlab - 如何在 matlab 中传递空引用以便 isa 返回 true?

android - 来自 WeakGlobalRef 的 JNI LocalRef

javascript - 无法绑定(bind)到 'property',因为它不是 'selector' 的已知属性