Оптимизация Mongoose и Angular Memory

0

Я пытаюсь найти подходящие методы для оптимизации моего приложения в отношении запросов против mongo и того, что передается обратно в пользовательский интерфейс.

Если у нас есть простая схема, как описано ниже, где каждый Профиль может иметь сотни разрешений объектов и тысячи разрешений полей:

     // schema element in objectPermission.js
    module.exports = mongoose.Schema({
      object: String,
      name: String,
      readable: Boolean,
      editable: Boolean
    });

     // schema element in fieldPermission.js
    module.exports = mongoose.Schema({
      allowCreate: Boolean,
      allowDelete: Boolean,
      allowEdit: Boolean,
      allowRead: Boolean,
      modifyAllRecords: Boolean,
      object: String,
      viewAllRecords: Boolean
    });

     // model definition in Profile.js
    module.exports = mongoose.model('Profile', {
      name: String,
      modifiedDate: Date,
      objectPermissions: [objectPermission],
      fieldPermissions: [fieldPermission]
    });

Первое состояние пользовательского интерфейса - это просто показать список профилей и позволить пользователю щелкнуть и отобразить разрешения объекта для выбранного профиля. Отсюда пользователь может щелкнуть любой профиль объекта и просмотреть разрешения для этого объекта.

Ничего сложного, и мой код работает по мере необходимости. Мой вопрос заключается в оптимизации запросов и управления памятью.

1) Я искал, но не смог найти, если у вас может быть mongo, только возвратите документ Profile без каких-либо документов для сиблинга (objectPermissions и fieldPermissions), я считаю, что ответ не вызывает удивления, есть ли способ сделать это.

2) Если ответ на 1 - нет, то при возврате данных для начальной страницы целесообразно установить неиспользуемые массивы сестер равными нулю, чтобы мы не пропускали огромное количество неиспользуемых данных по проводу? например

function getProfiles(req, res, removeSiblings) {
  dataService.findProfiles()
    .then(function(records) {
      if (removeSiblings) {
        for (var i = 0; i < records.length; i++) {
          records[i].objectPermissions = null;
          records[i].fieldPermissions = null;
        }
      }
      res.json(_buildSuccessObject('', records));
    })
    .catch(function(err) {
      res.json(_buildErrorObject('Error getting profile records ' + err, null));
    })
    .done(function() {
      console.log('Done Loading Profiles');
    });
};

3) Или, должен ли я создавать меньший более оптимизированный документ для этой итоговой страницы при хранении данных в манго и обеспечении синхронизации двух документов?

4) Начальная полезная нагрузка данных в пользовательский интерфейс составляет около 500 КБ - я очень беспокоюсь об оптимизации?

Теги:
optimization

1 ответ

1
Лучший ответ
  1. используйте select('name modifiedDat') в своем запросе, чтобы избежать ручного аннулирования этих больших полей. вы также можете использовать lean() lean ref
  2. ты прав.
  3. от вашего использования, я бы посоветовал вам разбивать на страницы (с skip и limit от мангуста) и устанавливать схемы таким образом из-за ограничения размера документа document max size ref

// schema element in objectPermission.js
module.exports = mongoose.Schema({
  profileId: {type:Schema.Types.ObjectId, ref:'Profile'}, //index profileId field can also boost up the performance
  object: String,
  name: String,
  readable: Boolean,
  editable: Boolean
});

 // schema element in fieldPermission.js
module.exports = mongoose.Schema({
  profileId: {type:Schema.Types.ObjectId, ref:'Profile'}, //index profileId field can also boost up the performance
  allowCreate: Boolean,
  allowDelete: Boolean,
  allowEdit: Boolean,
  allowRead: Boolean,
  modifyAllRecords: Boolean,
  object: String,
  viewAllRecords: Boolean
});

 // model definition in Profile.js
module.exports = mongoose.model('Profile', {
  name: String,
  modifiedDate: Date,
});

4. Я не знаю. вы, вероятно, можете использовать экспресс-морган, чтобы увидеть время отклика и проверку. Это ссылка https://github.com/expressjs/morgan#dev Или вы можете использовать инструменты разработчика Chrome для измерения времени.

  • 0
    Я дурак! Я шел по маршруту фильтра и потерял себя в неправильной части документа, спасибо - это сработало отлично! Также спасибо за другие советы, я прочитаю и посмотрю, что еще я могу выучить!

Ещё вопросы

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