【问题标题】:How to properly delete an orphaned reference in MongoDB?如何正确删除 MongoDB 中的孤立引用?
【发布时间】:2016-07-10 02:26:06
【问题描述】:

所以,我正在 Node 中构建一个类似博客的小型项目,但遇到了孤立数据库引用的问题。我在相互引用的单独文件中有两个模型。

这是我的模型:

// ./models/user   
Var UserSchema = mongoose.Schema({
  name: String,
  posts: [{type: mongoose.SchemaTypes.ObjectId, ref:'Post'}]
});

//  ./models/post
var PostSchema = mongoose.Schema({
  title:String,
  post_body: String,
  posted_by: mongoose.SchemaTypes.ObjectId
});

我的问题是,当您删除一个帖子时,您将如何删除用户帖子数组中的引用?我的想法是我可以创建一个中间件在删除路由之前运行,并在我实际删除帖子之前删除用户帖子数组中的引用。这会被认为是最好的方法吗?我在 Stack 上找到了一篇在这样的架构中使用“pre”函数的帖子:

 // ./models/post
 PostSchema.pre('remove', function(next){
    this.model('User').remove({posts: this._id}, next);
 });

这是实际的堆栈帖子:Automatically remove referencing objects on deletion in MongoDB。我无法得到这项工作。但是,我确实实现了一个自定义中间件来删除引用,但觉得这可能不是最佳实践。任何提示/建议将不胜感激。谢谢!

【问题讨论】:

    标签: node.js mongodb mongodb-query


    【解决方案1】:

    您不想在这里使用.remove(),但您想要.update()$pull

    PostSchema.pre('update',function(next) {
        this.model('User').update(
            { },
            { "$pull": { "posts": this._id } },
            { "multi": true },
            next
        );
    })
    

    这是从数组中删除某些内容的正确操作。 “multi”确保所有引用它的 User 对象的“post”都将被删除,因为它可能真的只是一个文档。

    .remove() 方法用于“删除”整个文档。 .update() 方法对文档进行“更改”。

    【讨论】:

    • 我不敢相信我没有想到这一点。在这里使用更新完全有意义。感谢。现在,我尝试了您发布的小 sn-p,但对象 ID 仍保留在用户的帖子数组中。在pre函数中,我同时使用了PostSchema.pre('update' ...PostSchema.pre('remove' ...,但是没有移除引用。
    • 我让它工作了。显然没有“删除”的查询钩子。如文档中所述:“如果您设置了“删除”挂钩,它将在您调用 myDoc.remove() 时触发,而不是在您调用 MyModel.remove() 时触发。我感谢您的帮助。这比我以前更干净/更好。
    • 我认为在update 上使用中间件可以删除引用的数据,即使您只是在更新PostSchema。不是吗?
    • 我尝试使用 mongoose 执行 findOne + updateOne,但它并不总是有效。当我连续删除项目时,它有时无法更新数组而不会引发错误。您使用 updateMany 的建议一直有效,但我不知道为什么。
    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 2014-07-24
    • 2021-06-12
    • 2017-02-27
    • 2011-07-18
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多