Метеор, 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 домашняя страница).
Другие вопросы по тегам