一次性保存多个对象Mongo(多对多只猫鼬)

时间:2016-08-03 15:51:22

标签: node.js mongodb mongoose mongoose-populate mongoose-schema

这是我的场景:

我有2个集合(表格):项目和学生(关系是多对多)。

我的模特是:

  • 项目:

    var ProjectSchema = new Schema({
    
    name: {
        type: String            
    },
    description: {
        type: String                
    },
    user : {
        type : Mongoose.Schema.Types.ObjectId,
        ref : "User"
    }
         });      
    Mongoose.model('Project', ProjectSchema);
    
  • 用户:

    var Userchema = new Schema({
    
    name: {
        type: String            
    },
    surname: {
        type: String                
    },
    project : {
        type : Mongoose.Schema.Types.ObjectId,
         ref : "Project"
     }
       });      
    Mongoose.model('User', UserSchema);
    

在我看来,我有2个输入,其中接收项目的名称和描述,然后有多选,其中选择1或多个用户为此项目。当我点击OK时:

  1. 创建项目,并将在BBDD中选为对象的所有用户添加到用户。
  2. 使用项目联合更新用户。
  3. 如果我选择1个用户,我会尝试下一个,但只有功能:

    exports.addUserProject = function(req, res) {   
    
    var project=new svmp.Project();
    
    project.name=req.body.name;
    project.description=req.body.description;   
    project.user=req.body.user[0]._id;  
    
    project.save(function(err,project){
        if (err) {
            return res.send(400, {
                message : getErrorMessage(err)
            });
        } else {
            res.jsonp(project);
        }
      })
     };
    

    我的BBDD的结果是下一个:

    {“_ id”:ObjectId(“57a200a38fae140913ac5413”),“user”:ObjectId(“578f41ddb0641d961416c3f5”),“name”:“Project1”,“Description”:“Project1 Desc”,“__ v”:0} < / p>

    感谢您的帮助

1 个答案:

答案 0 :(得分:1)

首先在模式定义中,由于关系是多对多关系,因此应将ref更改为引用对象的数组。例如,将user的{​​{1}}属性更改为对象ID数组,如此,

projectSchema

var ProjectSchema = new Schema({ name: { type: String }, description: { type: String }, user : [{ type : Mongoose.Schema.Types.ObjectId, ref : "User" }] }); 的{​​{1}}属性执行相同操作。

其次,在这一行project;您只将第一个选定用户的userSchema设置为用户,而忽略所有其他所选用户。这就是您的代码仅适用于一个用户的原因。相反,我建议您使用一个简单的循环将所有选定用户project.user=req.body.user[0]._id推送到项目的_id属性。您可以使用下面给出的_id循环。

user

如果您愿意,也可以使用简单的forEach执行此操作。

我相信上述建议应该可以解决您所描述的问题。