【问题标题】:Mongoose - saving user _id to a different Schema changes the IDMongoose - 将用户 _id 保存到不同的 Schema 会更改 ID
【发布时间】:2018-04-23 15:34:54
【问题描述】:

我是 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)

其次是我的团队架构,其中从通过用户架构创建的用户获取的 _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();

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

谁能告诉我哪里出错了?

【问题讨论】:

标签: javascript node.js mongodb mongoose


【解决方案1】:

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

id, email, role, inviteToken, inviteTokenExpires

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

但是因为它是另一个“对象”(数组的团队成员项),它有自己的id,这就是为什么访问members[X]._id 仍然返回一个ID。之所以如此相似,是因为 mongo ids 基于时间戳一个唯一的 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
    }
});

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 2015-02-09
    • 2013-06-19
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2013-09-16
    相关资源
    最近更新 更多