Мангуст |Сохранить одинаковое население для всех функций - PullRequest
0 голосов
/ 13 июня 2019

У меня есть эта схема для моей модели урожая

var CropSchema = new mongoose.Schema({
    name: String,
    zones: [{
        type: Schema.Types.ObjectId,
        ref: 'zone'
    }],
    ...
});

Эта схема для моей модели зоны

var ZoneSchema = new mongoose.Schema({
    name: String,
    poor: [{
        type: Schema.Types.ObjectId,
        ref: 'condition'
    }],
    ...
});

Эта схема для моей модели состояния

var ConditionSchema = new mongoose.Schema({
    name: String,
    action_on_controls: [{
        type: Schema.Types.ObjectId,
        ref: 'control'
    }],
    ...
});

И эта схема для моей модели управления

var ControlSchema = new mongoose.Schema({
    name: String,
    ...
});

Я получаю все урожаи в узле так:

  public index(req: Request, res: Response) {
    return Crop.find().populate('zones').populate({
      path: 'zones',
      populate: [
        {
          path: 'poor', populate: [
            { path: 'action_on_controls' }]
        }
      ]
    }).exec()
      .then(respondWithResult(res, 200))
      .catch(handleError(res, 500));
  }

Способ получения отдельного урожая таков:

  public show(req: Request, res: Response) {
    return Crop.findById(req.params.id).populate({
      path: 'zones',
      populate: [
        {
          path: 'poor', populate: [
            { path: 'action_on_controls' }]
        }
      ]
    }).exec()
      .then(handleEntityNotFound(res))
      .then(respondWithResult(res, 200))
      .catch(handleError(res, 500));
  }

Как видите, часть:

.populate ({..}) * * тысяча тридцать шесть

повторяется дважды.

Как сохранить одинаковые заполненные конфигурации, чтобы мне не приходилось постоянно писать / обновлять одно и то же?

1 Ответ

1 голос
/ 15 июня 2019

Вы можете сохранить заполненный объект как переменную и поделиться им:

const zonePopulateObj = {
  path: 'zones',
  populate: [
    {
      path: 'poor', populate: [
        { path: 'action_on_controls' }]
    }
  ]
};

А затем в ваших запросах

return Crop.find().populate(zonePopulateObj).exec();

return Crop.findById(req.params.id).populate(zonePopulateObj).exec();

Или вы можете вывести логику запроса в новую функциюи поделитесь этим

public index(req: Request, res: Response) {
    return findCrop()
      .then(respondWithResult(res, 200))
      .catch(handleError(res, 500));
  }


public show(req: Request, res: Response) {
    return findCrop(req.params.id)
      .then((array)=>array.length ? array[0] : {})
      .then(handleEntityNotFound(res)) // may need to update this function not sure how it checks for not found.
      .then(respondWithResult(res, 200))
      .catch(handleError(res, 500));
  }



  const findCrop = (id)=>{
      let queryObj = {};
      if(id){
          queryObj._id=id
      }
      return Crop.find(queryObj).populate({
        path: 'zones',
        populate: [
          {
            path: 'poor', populate: [
              { path: 'action_on_controls' }]
          }
        ]
      }).exec()
  }

Лично я предпочитаю первый метод.

...