簡體   English   中英

貓鼬-將用戶_id保存到其他模式會更改ID

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM