Mongoose - 将用户_id保存到其他Schema会更改ID

时间:2017-11-10 11:53:35

标签: javascript node.js mongodb mongoose

我是Mongo DB / Mongoose的新手,在尝试将用户ID添加到其他Schema时遇到了问题。首先,这是我的用户架构,按预期工作:

const userSchema = new Schema({
    email:{
            type:String,
            unique:true,
            lowercase:true,
            trim:true,
            validate:[
                            validator.isEmail,'Invalid email address'
            ],
            required:'Please supply an email address'
    },
    name:{
            type:String,    
            trim:true,     
            required:'Please supply a name'        
    },
    userType:{
            type:String,       
            required:'Please supply a user type'            
    },
    teams:{
        type:Array
    }
});

userSchema.plugin(passportLocalMongoose,{usernameField:'email'});
userSchema.plugin(mongodbErrorHandler);

module.exports = mongoose.model('User',userSchema)

其次,这是我的团队架构,其中从通过用户架构创建的用户获取的_id由于某种原因存储为稍微不同的值:

const teamSchema = new Schema({
    owner:{
        type:String,
        required:'Please submit a user id'
    },
    members:[
    {
      id:String,
      email:String,
      role:String,
      inviteToken:String,
      inviteTokenExpires:String        
    }
    ],
    teamSlotsAllowed:{
        type:Number
    }
});

module.exports = mongoose.model('Team',teamSchema);

在Node I中创建一个像这样的新用户:

const user = new User({
  email:req.body.email,
        userType:userType,
        name:req.body.name
})

const register = promisify(User.register,User);
await register(user,req.body.password);

我打电话给下一个将它们分配给团队的中间件:

const user = await User.findOne({email:req.body.email});

  const team = new Team({
        owner: user._id,
        members: [
            {
                userID:user._id,
                email:user.email,
                role:'owner',
                inviteToken:'',
                inviteTokenExpires:''
            }
        ],
        teamSlotsAllowed: 14        
});     

let newTeam = await team.save();

     user.teams = newTeam._id;

    await user.save();

使用团队Schema,owner属性实际上存储了与用户模式的_id匹配的正确值。但是在members数组中,userID与正确的ID略有不同。例如,如果_id以24bcc结尾,它将作为24bcd存储在members.userID中 - 喜欢它因某种原因递增?

谁能告诉我哪里出错了?

1 个答案:

答案 0 :(得分:0)

问题是您正在使用以下属性创建teamSchema的成员数组:

id, email, role, inviteToken, inviteTokenExpires

但是,当您将其分配给团队时,您将进一步向下分配:userID: user._id。现在发生的事情是该字段在您的模式中不存在,因此被Mongoose完全忽略。 (当您使用特定数据创建文档时,将忽略模式中不存在的任何属性)

但是因为它是另一个“对象”(数组的团队成员项),它有自己的id,这就是为什么访问members[X]._id仍会返回一个ID 。它之所以如此相似,是因为mongo id基于时间戳是唯一的ID。所以它的前半部分是相似的,而id的后半部分通常是增量,这就是为什么它们现在似乎相似(如果你创建了数千个条目就不会发生这种情况)

您需要做的就是将teamSchema更改为此,我相当确定它会起作用:

const teamSchema = new Schema({
    owner:{
        type:String,
        required:'Please submit a user id'
    },
    members:[
    {
      userID:String, // <- THIS IS THE CHANGE
      email:String,
      role:String,
      inviteToken:String,
      inviteTokenExpires:String        
    }
    ],
    teamSlotsAllowed:{
        type:Number
    }
});