Mongoose объединяет свойства в одно составное свойство - PullRequest
0 голосов
/ 01 июня 2019

Я занимаюсь разработкой веб-приложения. Бэкэнд-часть написана на NodeJS с использованием Mongoose.

У меня есть простая схема пользователя:

const UsersSchema = new Schema({
  login: {
    type: String,
    required: true,
    lowercase: true,
    trim: true,
    unique: true
  },
  password: {
    type: String,
    required: true,
    trim: true
  },
  email: {
    type: String,
    required: true,
    trim: true
  },
  firstName: {
    type: String,
    required: true,
    trim: true
  },
  lastName: {
    type: String,
    required: true,
    trim: true
  }
});

Мне нужно вернуться, чтобы добавить свойство fullName без фактического добавления его в базу данных. Конечно, я могу просто соединить вот так this.firstName + " " + this.lastName.

Но мне интересно, есть ли лучший способ получить желаемое поведение.

Я также использую библиотеку mongoose-pagination-2 для поддержки нумерации страниц:

const users = await Users.paginate({}, queryParams);

Пожалуйста, дайте несколько советов. Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 июня 2019

Вы можете получить желаемые результаты, используя замечательную функцию под названием Virtuals .

Это позволяет достичь именно того, что вам нужно.

Для вашего случая вам нужно выполнить несколько шагов:

  1. Определение виртуального свойства и метода get

    UsersSchema.virtual('fullName').get(function () {
       return this.firstName + " " + this.lastName;
    });
    
  2. После определения виртуального свойства вы сможете получить к нему доступ из модели. Однако при выполнении запроса он будет отсутствовать. Кроме того, вы используете библиотеку нумерации страниц. Чтобы вернуть виртуальное свойство как результат запроса, нам нужно настроить методы toObject и toJSON следующим образом:

    UsersSchema.set('toObject', { virtuals: true });
    UsersSchema.set('toJSON', { virtuals: true });
    

Теперь вы можете запрашивать документы, а также должно возвращаться виртуальное свойство.

0 голосов
/ 01 июня 2019

вы можете отобразить пользователей после извлечения из базы данных:

const users = await Users.paginate({}, queryParams);
users.docs = users.docs.map((user)=>{
    let fname=user.firstName!=null?user.firstName:'';
    let lname=user.lastName!=null?user.lastName:'';
    user.fullName= fname + " " + lname; 
    return user;
});
...