Метеор, mongodb - оптимизация столовой
TL;DR: я делаю приложение для столовой. У меня есть коллекция с людьми и коллекция, в которой я "регистрирую" каждое мясо, которое взял. Мне нужно знать тех, кто не принимал еду.
Длинная версия:
Я подаю заявку в мой местный Красный Крест.
Я пытаюсь оптимизировать эту ситуацию:
В столовой есть люди, которым помогают продукты на завтрак, обед и ужин. Нам нужно знать, сколько человек приняло пищу (и это легко).
если они присутствуют, они должны принимать пищу и есть, поэтому нам нужно знать, сколько (и кто) не ел (это часть, которую мне нужно оптимизировать).
Когда они принимают еду, "кассир" вставляет свой штрих-код, программа регистрирует "транзакцию" в журнале сбора.
На самом деле, при создании шаблона "столовая" я создаю локальную коллекцию "питание" и заполняю ее данными всех людей в БД (таким образом, ID, имя, пост / сытый), затем я использую эту коллекцию для своего счетчики и показать, кто принимал пищу, а кто нет. (переменная "foodKind" is = "завтрак" ИЛИ "обед" ИЛИ "ужин" в зависимости от фактической порции.)
Template.canteen.created = function(){
Meals=new Mongo.Collection(null);
var today= new Date();today.setHours(0,0,1);
var pers=Persons.find({"status":"present"},{fields:{"Name":1,"Surname":1,"barcode":1}}).fetch();
pers.forEach(function(uno){
var vediamo=Log.findOne({"dest":uno.codice,"what":mealKind, "when":{"$gte": today}});
if(typeof vediamo=="object"){
uno['eat']="satiated";
}else{
uno['eat']="fasting";
}
Meals.insert(uno);
});
};
Template.canteen.destroyed = function(){
meals.remove({});
};
Из коллекции еды я страдаю от скуки двух групп людей (с именем, фамилией и штрих-кодом) и поста, а также использую двух помощников:
fasting:function(){
return Meals.find({"eat":"fasting"});
}
"countFasting":function(){
return Meals.find({"eat":"fasting"}).count();
}
//same for satiated
Это было нормально, но теперь число людей действительно увеличивается (нас около 1000 и мы считаем), и создание страницы очень-очень медленное, и обычно оно останавливается с ошибками, поэтому я могу прочитать, что "100 постов, 400 сытых" но у меня в БД около 1000 человек.
Я не могу понять, как оптимизировать рабочий процесс, каждый другой метод, который я пробовал, включал (так или иначе) больше запросов к БД; Я думаю, что упустил момент и теперь не вижу этого. Я не уверен насчет агрегации на этом уровне и внутри метеора из-за минимонго.
Хотя создание серверной стороны, а не клиентской, является умным, проблема здесь в том, КАК отличить "голодание" от "насыщения" без циклической обработки всей коллекции сотрудников.
+1, если решение совместимо с aleed:tabular
1 ответ
РЕДАКТИРОВАТЬ
Я до сих пор не уверен в том, что вызывает вашу проблему с производительностью (слишком много вещей в клиентской памяти / минимонго, слишком много обращений к нему?), Но вы могли бы по крайней мере попробовать другие подходы, более традиционно основанные на вашем сервере.
Кстати, вы не упомянули ни о том, как вы отображаете свои данные, ни о том, как вы получаете неправильное показание для вашего числа уже обслуженных / пропавших без вести Persons
?
Если вы строите классический HTML table
Обратите внимание, что браузеры борются с отображением более нескольких сотен строк. Если вы в этом случае, вы можете реализовать нумерацию таблиц на стороне клиента / бесконечную прокрутку. Посмотрите, например, на плагин jQuery DataTables (на котором основан aldeed:tabular
). Пропустить шаг построения фактического HTML table
и заполните его напрямую, используя $table.rows.add(myArrayOfData).draw()
чтобы избежать ограничений браузера.
Оригинальный ответ
Я не совсем понимаю, зачем вам дублировать ваши Persons
сбор в сторону клиента Meals
местная коллекция?
Для этого необходимо, чтобы у вас были все документы Persons
отправлено с сервера на клиент (это может быть проблематично, если ваш сервер хорошо подключен / локальн. У вас также может быть autopublish
пакет, так что вы уже видели это наказание), а затем клонировать все документы (проверка вашего Logs
сборник, чтобы восстановить любые предыдущие отрывки), эффективно удваивая вашу память.
Ваш сервер и / или удаленная БД медленно работают, чтобы оправдать необходимость делать все локально (на стороне клиента)?
Может быть гораздо более проблематичным, если у вас открыто более одного браузера "кассир" / клиент, их Meals
локальные коллекции не будут синхронизированы.
Если у вас хорошее соединение сервер-клиент, нет причин делать все на стороне клиента. Meteor автоматически кеширует только то, что нужно, и обеспечивает оптимистическую модификацию БД для обеспечения быстрого взаимодействия с пользователем (если вы правильно структурируете свой код).
- С
aldeed:tabular
пакет, вы можете легко отобразитьPersons
большой стол по "страницам". - Вы также можете связать его с вашим
Logs
Коллекция с использованиемdburles:collection-helpers
(IIRC есть примерaldeed:tabular
домашняя страница).