gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:39:58 24 4
gpt4 key购买 nike

在较高层面上,我希望从 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com