【问题标题】:Save multiples Objects At Once Mongo(Many To Many Mongoose)一次保存多个对象 Mongodb(Many To Many Mongoose)
【发布时间】:2016-12-09 10:55:42
【问题描述】:

这是我的场景:

我有 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 个或多个用户。当我点击确定时应该:

  1. 创建项目,并将所有在 BBDD 中选择为对象的用户添加到用户。
  2. 使用项目关联更新用户。

我尝试下一个,但只有在我选择 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 }

感谢您的帮助

【问题讨论】:

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


    【解决方案1】:

    首先在您的架构定义中,由于关系是多对多的,您应该将ref 更改为引用对象的数组。例如,将projectSchema 的user 属性更改为对象ID 数组,如下所示,

    var ProjectSchema = new Schema({
          name: {
            type: String            
          },
         description: {
           type: String                
          },
        user : [{
          type : Mongoose.Schema.Types.ObjectId,
          ref : "User"
         }]
       });      
    

    对userSchema 的project 属性执行相同操作。

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

    var selectedUsers = req.body.user;
    selectedUsers.forEach(function(u){
      project.user.push(u._id)
    })
    

    如果您愿意,也可以使用简单的for loop 来完成此操作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      相关资源
      最近更新 更多