[英]Mongoose - saving user _id to a different Schema changes the ID
我是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中,我像這樣創建一個新用戶:
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();
對於團隊架構,owner屬性實際上存儲了與用戶架構的_id相匹配的正確值。 但是在成員數組中,userID與正確的ID略有不同。 例如,如果_id以24bcc結尾,它將以24bcd的形式存儲在members.userID中-出於某種原因,它喜歡遞增嗎?
誰能告訴我我哪里出問題了?
問題是您正在使用以下屬性創建teamSchema
的members數組:
id, email, role, inviteToken, inviteTokenExpires
但是,在將其分配給團隊時,您將分配給以下userID: user._id
。 現在發生的事情是該字段在您的模式中不存在,因此被Mongoose完全忽略了。 (當您創建具有特定數據的文檔時,架構中不存在的任何屬性都將被忽略)
但是因為它是另一個“對象”(數組的團隊成員),所以它具有自己的id
,這就是為什么訪問member 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
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.