我有一个Assignment schema,其中提到了GroupsProjects.

Assignment == Group [One-One Relationship]
Assignment == Projects [One-Many Relationship]

下面是我的Asssignment个模式

var AssignmentSchema = new Schema({
    name: String,
    group: {
        type: Schema.Types.ObjectId,
        ref: 'Group'
    },
    projects: [{type: mongoose.Schema.Types.ObjectId, ref: 'Project'}],
});

如果删除了Group/Project,我如何更新我的作业(job)模式.

var ProjectSchema = new Schema({
    name: String
});

var GroupSchema = new Schema({
    name: String
});

从stackoverflow中的几个答案中,我了解了remove中间件,但我不确定如何实现它.谁能给我举个例子吗.

ProjectSchema.pre('remove', function(next){
    this.model('Assignment').update(

    );
});

推荐答案

Relationships:

  1. 一个州只有一个人的one-to-one is a relationship美元
  2. 一个one-to-many is a relationship岁的母亲有很多
  3. 一本书的作者是many-to-many is a relationship

一对一关系-If a 100 is removed, how can i update my 101 Schema.

通常,一个project映射到一个assignment,同样,一个assignment映射到一个project.您可以在这里删除一个项目,然后在分配模型中找到相关的project,并删除它们的引用.

delete: function(req, res) {
   return Project.findById(req.params.id, function(err, project){
         return project.remove(function(err){
             if(!err) {
                 Assignment.update({_id: project.assignment}}, 
                      {$pull: {projects: project._id}}, 
                          function (err, numberAffected) {
                            console.log(numberAffected);
                      } else {
                        console.log(err);                                      
                    }
                  });
            });
        });
}

一对多的关系——If a 100 is removed, how can i update my 101 Schema.

在这个场景中,我们删除一个项目,然后找到属于这个project的所有assignments个项目,并从中删除它的引用.在这种情况下,一个项目可能有很多任务.

delete: function(req, res) {
   return Project.findById(req.params.id, function(err, project){
         return project.remove(function(err){
             if(!err) {
                 Assignment.update({_id: {$in: project.assingments}}, 
                      {$pull: {project: project._id}}, 
                           function (err, numberAffected) {
                            console.log(numberAffected);
                      } else {
                        console.log(err);                                      
                    }
                  });
            });
        });
}

Remove middleware

正如约翰尼所指出的那样,你可以通过middleware达到同样的效果,只是一个修正..

ProjectSchema.pre('remove', function (next) {
    var project = this;
    project.model('Assignment').update(
        { projects: {$in: project.assignments}}, 
        { $pull: { project: project._id } }, 
        { multi: true }, 
        next
     );
});

通常,可以有许多projects属于一个assignment,许多assignments属于同一个project.在Project模式中有一个assignment列,其中一个项目与多个任务相关.

Note:删除中间件不会在模型上工作,它只会在文档上工作.如果你在删除函数中使用remove,你会先找到project by id,然后在返回的document上应用remove方法,这样上面的方法就可以工作了...您的删除函数如下所示.

delete: function(req, res) {
   return Project.findById(req.params.id, function(err, project){
         return project.remove(function(err){
             if(!err) {
                  console.log(numberAffected);
             } 
           });                
    });
 }

Mongodb相关问答推荐

Mongo如何找到字段排除特殊字符

我可以在BSON中使用代理字段吗?

如何对嵌套在另一个数组中的数组中的字段执行查找?

MongoDB $lookup 查找字段值数组

在 ExpirePolicy 之后从 Store 中删除元素

根据条件删除一些数组元素并将数组的大小更新为mongo中的另一个文件

程序可以运行,但我不断收到发送到客户端后无法设置标题,我应该忽略它吗?

Mongodb聚合查找连接两个对象字段的集合数组匹配对象索引字段的总和

MongoDB 存储大量指标/分析数据的方法

Spring Data + MongoDB GridFS 可以通过 Repository 访问吗?

MongoDB查询仅返回嵌入文档

Mongodb 仅在值唯一时插入,否则更新 - 在 node.js 中

如何检索 MongoDb 集合验证器规则?

MongoDB插入引发重复键错误

mongo - 如何查询嵌套的 json

Django admin 和 MongoDB,可能吗?

直接从 URL 查询字符串提供的 mongo 查询有多危险?

Mongo按实际上是数字的字符串值排序

我可以只获取 Cursor 对象(pymongo)中的第一项吗?

将 FilterDefinition 转换为可以在 mongo shell 中运行的常规 json mongo 查询