如何正确删除MongoDB中的孤立引用?

时间:2016-03-22 23:44:57

标签: node.js mongodb mongodb-query

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

以下是我的模特:

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

我的问题是当你删除发帖,帖子时,你会如何删除用户帖子中的引用?我的想法是我可以创建一个在删除路由之前运行的中间件,并在我实际删除帖子之前删除User的post数组中的引用。这会被认为是最好的方式吗?我在Stack上发现了一个使用' pre'在这样的模式中的函数:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main() {

    int fd[2];
    pipe(fd);
    int k;
    char a[32];
    char b[32] = "1\n\0";
    char c[32] = "2\n\0";
    char d[32] = "3\n\0";

    k = fork();

    if (k == 0) {
        dup2(fd[0], fileno(stdin));
        close(fd[0]);
        dup2(fd[1], fileno(stdout)); // Commenting this out will fix the hanging. Why?
        close(fd[1]);
        while (read(fileno(stdin), a, sizeof(a)) > 0) {
            fprintf(stderr, "PID %d is printing %s", getpid(), a);
        }
        exit(0);
    }
    close(fd[0]);
    write(fd[1], b, sizeof(b));
    write(fd[1], c, sizeof(c));
    write(fd[1], d, sizeof(d));
    close(fd[1]);

    return 0;

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

1 个答案:

答案 0 :(得分:4)

您不希望.remove()在此处,但您希望.update()代替$pull

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

这是从数组中删除内容的正确操作。 “multi”确保删除引用它的所有User对象的“post”,认为它可能实际上只是一个文档。

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