Mongoose - 将用户 _id 保存到不同的 Schema 会更改 ID

Posted

技术标签:

【中文标题】Mongoose - 将用户 _id 保存到不同的 Schema 会更改 ID【英文标题】:Mongoose - saving user _id to a different Schema changes the 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 中 - 喜欢它出于某种原因而递增吗?

谁能告诉我哪里出错了?

【问题讨论】:

你应该引用另一个类似这样的架构***.com/a/18002078/5532806 【参考方案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
    
);

【讨论】:

以上是关于Mongoose - 将用户 _id 保存到不同的 Schema 会更改 ID的主要内容,如果未能解决你的问题,请参考以下文章

保存后访问子文档 ID - mongoose

Mongoose - 获取新保存的内部记录的_id

Mongoose - 获取新保存的内部记录的_id

使用 express/mongoose 将用户 IP 地址保存到数据库

Mongoose / MongoDB _id 作为字符串

mongoose 和 typescript 如何自动将 '_id' 转换为 'id'?