mongoose – 保存用户_id到不同的模式更改ID

我是新来的Mongo DB / Mongoose,并尝试将用户的ID添加到不同的架构时遇到问题。 首先这里是我的用户架构,按预期工作:

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) 

其次,这里是我的团队架构,其中从用户模式创build的用户获取的_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); 

在节点中,我创build一个新的用户,如下所示:

 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匹配的正确值。 但是在成员数组中,用户标识与正确的标识稍有不同。 例如,如果_id以24bcc结尾,它将以24bcd的forms存储在members.userID中 – 喜欢因为某种原因递增?

谁能告诉我我哪里出了问题?

问题是你正在用以下属性创build你的teamSchema的成员数组:

 id, email, role, inviteToken, inviteTokenExpires 

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

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

所有你需要做的,是改变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 } });