Я пытаюсь найти подходящие методы для оптимизации моего приложения в отношении запросов против 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 КБ - я очень беспокоюсь об оптимизации?
select('name modifiedDat')
в своем запросе, чтобы избежать ручного аннулирования этих больших полей. вы также можете использовать lean()
lean refskip
и 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 для измерения времени.