Mongoose - сохранение пользователя _id в другой схеме изменяет идентификатор

1

Я новичок в Mongo DB/Mongoose и столкнулся с проблемой при попытке добавить идентификатор пользователя к другой схеме. Прежде всего Вот моя пользовательская схема, которая работает так, как ожидалось:

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);

В узле я создаю нового пользователя следующим образом:

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();

С помощью команды Schema свойство owner фактически сохраняет правильное значение, соответствующее пользовательской схеме _id. Но внутри массива членов идентификатор пользователя немного отличается от правильного идентификатора. Например, если _id заканчивается на 24bcc, он будет сохранен в member.userID как 24bcd - по какой-то причине он по-разному увеличивается?

Может ли кто-нибудь сказать мне, где я ошибся?

Теги:
mongoose

1 ответ

0
Лучший ответ

Проблема в том, что вы создаете свой teamSchema членов teamSchema со следующими свойствами:

id, email, role, inviteToken, inviteTokenExpires

Однако в дальнейшем, когда вы назначаете его команде, вы назначаете: userID: user._id. Теперь, что происходит, что это поле не существует в вашей схеме и поэтому полностью игнорируется Mongoose. (Любые свойства, которые не существуют в вашей схеме, игнорируются при создании документа с определенными данными)

Но поскольку это еще один "объект" (элемент члена команды массива), он имеет свой собственный id, поэтому доступ к members[X]._id прежнему возвращает идентификатор. И причина, по которой это так похоже, заключается в том, что идентификаторы mongo основаны на отметке времени и уникальном идентификаторе. Таким образом, первая половина будет аналогичной, а вторая половина идентификатора обычно инкрементальна, поэтому они кажутся похожими на данный момент (чего не было бы, если бы вы создали тысячи записей).

Все, что вам нужно сделать, это изменить 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
    }
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню