Как можно преобразовать модель в разные ответы в Mongoose - PullRequest
0 голосов
/ 06 августа 2020

Я создаю свою схему и свою модель с помощью Mon goose, и мне нужно вернуть определенную c информацию на разные конечные точки в моем приложении, что-то вроде этого (упрощенный пример моего кода)

Это моя схема:

const userSchema = new mongoose.Schema({
  idNumber: Number,
  name: String,
  lastName: String,
  city: String,
  age: Number
});

А это моя модель:

const User = mongoose.model('User', userSchema);

Теперь я хочу вернуть c информацию о моей модели, что-то вроде этого

router.get('/:id/getJustName', (req, res, next) => {
    User.find({ idName: req.params.id }, (err, user) => {
        //I want just return the property Name, without _id, __v, lastName, ...
    })
});

router.get('/:id/getJustCity', (req, res, next) => {
    User.find({ idName: req.params.id }, (err, user) => {
        //I want just return the property City, without _id, __v, lastName, ...
    })
});

Я знаю, что могу вернуть что-то вроде user.city и сделать delete для _id, __v и других свойств, которые мне не нужны, но мое приложение сильно увеличивается, и этот способ сделать это не обслуживается. Я гость, я могу сделать что-то вроде преобразования в другой схеме, но я нашел что-нибудь связанное с этим: (

Спасибо за помощь, я надолго застрял в этой проблеме.

----- Изменить 1 -----

Я попытался добавить собственное преобразование в определение схемы, но это не сработало: (

Я пробовал это:

const userSchema = new mongoose.Schema(/path/of/my/schema, {
  toObject: {
    transform: function (doc, ret) {
      delete ret._id;
    }
  },
  toJSON: {
    transform: function (doc, ret) {
      delete ret._id;
    }
  },
  toReturnSpecificInfo: {
    transform: function (doc, ret) {
      delete ret._id;
      delete ret.lastName;
    }
  }
});

Когда я звоню

User.find((err, users) => {
  console.log(users[0].toJSON()); // This works
  console.log(users[0].toReturnSpecificInfo()); // This is Not working
})

1 Ответ

2 голосов
/ 06 августа 2020

Вы можете использовать async / await и сделать следующее:

router.get('/:id/getJustName', async (req, res) => {
    await User.find({ idName: req.params.id }).select({"name": 1, "_id": 0})
});

Аналогично для другого запроса вы можете сделать:

router.get('/:id/getJustCity', async (req, res) => {
    await User.find({ idName: req.params.id }).select({"city": 1, "_id": 0})
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...