我是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中 - 喜欢它因某种原因递增?
谁能告诉我哪里出错了?
答案 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
}
});