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的主要内容,如果未能解决你的问题,请参考以下文章