2016-01-30 4 views
0

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

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

 // 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 КБ - я очень беспокоюсь об оптимизации?

ответ

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. Я не знаю. вы, вероятно, можете использовать express morgan, чтобы увидеть время отклика и проверку. Это ссылка https://github.com/expressjs/morgan#dev Или вы можете использовать инструменты для создания хрома для измерения времени.

+0

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

Смежные вопросы