Как обновить только некоторые свойства объекта в базе данных MongoDB с помощью массивов - PullRequest
0 голосов
/ 25 апреля 2018

Это в основном тот же вопрос, что и этот вопрос ... StackOverflow Вопрос ... но мне нужно знать поведение массивов.

У меня проблемы с $ set stillОбновление других переменных. Это мой запрос, и он работает для обновления этих переменных, но он также устанавливает некоторые массивы (media: [] и sports: []), которые есть в athleteProfile.0, обратно на пустое.

Для наглядности приведена схема для пользовательского объекта.

UserSchema.js

const UserSchema = new Schema({
 password: { type: String, required: true },
 username: { type: String, unique: true, required: true },
 role: { type: String, required: true },
 athleteProfile: [AthleteSchema],
 evaluatorProfile: [EvaluatorSchema],
 adminProfile: [AdminSchema],
 search: [SearchSchema]
});

AthleteSchema.js

const AthleteSchema = new Schema({
 athEmail: String,
 firstName: {
   type: String,
   validate: {
     validator: (firstName) => firstName.length > 2,
     message: 'Name must be longer than 2 characters.'
   }
 },
 lastName: {
   type: String,
   validate: {
     validator: (lastName) => lastName.length > 2,
     message: 'Name must be longer than 2 characters.'
   }
 },
 profilePic: String,
 accountType: String,
 events: [{
   ref: 'Events',
   type: Schema.Types.ObjectId
 }],
 media: [MediaSchema],
 city: String,
 state: String,
 zip: Number,
 country: { type: String, uppercase: true },
 height: String,
 weight: Number,
 birthday: Date,
 sports: {
  type: [SportSchema],
   validate: [arrayLimit, '{PATH} exceeds the limit of 3']
 },
 references: {
   type: [ReferenceSchema],
   validate: [arrayLimit, '{PATH} exceeds the limit of 3']
 },
 evaluations: [EvaluationSchema],
 gradYear: Number,
 school: String
});

А затем это запрос.

  User.findByIdAndUpdate({ _id: id }, {
   $set:
  { username,
    password,
     'athleteProfile.0': {
      firstName,
      lastName,
      athEmail: email,
      gradYear,
      school,
      birthday,
      city,
      state,
      zip,
      weight,
      height
  }}
}, { returnNewDocument: true});

Что я делаю не так?

1 Ответ

0 голосов
/ 25 апреля 2018

Ваш вопрос совершенно неясен: какое поле вы хотите обновить, поэтому я понял, что вы можете использовать код:

User.findById(id, function (err, user) {

  if (err) return handleError(err);

  user.keytochange = newvalue;

  user.save(function (err, updatedUser) {


    if (err) return handleError(err);

    res.send(updatedUser);

  });
}) 

Из вопроса, который я понял, вы хотите обновить athleteProfile до0, поэтому измените его соответственно

Редактирование ответа после обновленного вопроса Итак, после просмотра вопроса вы пытаетесь обновить базу данных atheleprofile для данного пользователя, поэтому я рекомендую вам не передавать схему who вatheletprofile скорее передает объект с ref для пользователя что-то вроде этого

title: String, Atheleprofile: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, Теперь сопоставьте его соответственно, чтобы при добавлении пользователя передать objectId пользователя в atheleprofile и затем в функцию обновления.как это

User.findById (id, функция (err, пользователь) {if (err) return handleError (err);

  Atheleprofile.findById(user.id , (err,atheleprofile) => {
           Atheleprofile.fieldnam = newvalue;
          Athelerpofile.save((err,newAtheleprofileObejct) =>{
             console.log("done changes");
       }
     }



  });
}) `
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...