Поиск…


замечания

Полезный способ подумать о коллекциях Монго в терминах Who, What, When, Where, Why и How. У Mongo есть следующие оптимизации для разных типов данных:

Где - GeoJSON
Когда - временные метки ObjectID
Кто - строки счетчика метеоров
How - JSON для деревьев решений

Который оставляет документ по умолчанию в Монго, грубо говоря, «Что».

Создание записей в устаревшей базе данных

Вы можете по умолчанию использовать обычный формат Mongo, указав свои коллекции в поле idGeneration.

MyCollection = new Meteor.Collection('mycollection', {idGeneration : 'MONGO'});

Вставка данных в документ

Многие новички в Mongo борются с основами, например, как вставить массив, дату, логическое значение, переменную сеанса и т. Д. В запись документа. В этом примере приведены некоторые рекомендации по основным входам данных.

Todos.insert({
  text: "foo",                        // String
  listId: Session.get('list_id'),     // String
  value: parseInt(2),                 // Number
  done: false,                        // Boolean
  createdAt: new Date(),              // Dimestamp
  timestamp: (new Date()).getTime(),  // Time
  tags: []                            // Array
});

Получение _id из недавно созданного документа

Вы можете получить его либо синхронно:

var docId = Todos.insert({text: 'foo'});
console.log(docId);

Или асинхронно:

Todos.insert({text: 'foo'}, function(error, docId){
  console.log(docId);
});

Временные данные

Использование MongoDB для данных временных рядов - очень хороший документ и установленный прецедент с официальными документами и презентациями. Прочтите и посмотрите официальную документацию от MongoDB, прежде чем пытаться изобрести свои собственные схемы для данных временных рядов.

MongoDB для данных временных рядов

В общем, вы захотите создать «ведра» для ваших данных таймера:

DailyStats.insert({
   "date" : moment().format("MM-DD-YYYY"),
   "dateIncrement" : moment().format("YYYYMMDD"),
   "dailyTotal" : 0,
   'bucketA': 0,
   'bucketB': 0,
   'bucketC': 0
   });

Затем добавьте эти ведра в качестве фидов данных в ваше приложение. Этот прирост можно поместить в методе Метеор, наблюдателе коллекции, конечной точке REST API и в других местах.

DailyStats.update({_id: doc._id}, {$inc: {bucketA: 1} });

Более подробный пример «Метеор» см. В примерах из трека «Clinical Meteor»:

Конвейер аналитики Realtime Analytics
Клинические метеориты - графики - Дайлистаты

Фильтрация с помощью регулярных выражений

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

// create our collection
WordList =  new Meteor.Collection("wordlist");

// and a default session variable to hold the value we're searching for
Session.setDefault('dictionary_search', '');

Meteor.isClient(function(){
    // we create a reactive context that will rerun items when a Session variable gets updated 
    Deps.autorun(function(){
        // and create a subscription that will get re-subscribe to when Session variable gets updated
        Meteor.subscribe('wordlist', Session.get('dictionary_search'));
    });

    Template.dictionaryIndexTemplate.events({
        'keyup #dictionarySearchInput': function(evt,tmpl){
            // we set the Session variable with the value of our input when it changes
            Session.set('dictionary_search', $('#dictionarySearchInput').val());
        },
        'click #dictionarySearchInput':function(){
            // and clear the session variable when we enter the input
            Session.set('dictionary_search', '');
        },
    });
});
Meteor.isServer(function(){
    Meteor.publish('wordlist', function (word_search) {
        // this query gets rerun whenever the client subscribes to this publication
        return WordList.find({
            // and here we do our regex search
            Word: { $regex: word_search, $options: 'i' }
        },{limit: 100});
    });
});

И HTML, который используется на клиенте:

<input id="dictionarySearchInput" type="text" placeholder="Filter..." value="hello"></input>

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

Учебное пособие по регулярному выражению
Шрифт регулярного выражения
Регулярные выражения в Javascript

Геопространственные коллекции - больше обучения

Геопространственные коллекции обычно включают хранение GeoJSON в базе данных Mongo, передачу этих данных клиенту, доступ к window.navigator.geolocation , загрузку API Карт, преобразование GeoJSON в LatLngs и построение графика на карте. Предпочтительно все в режиме реального времени. Вот список ресурсов, которые помогут вам начать работу:

Запросы аудиторской коллекции

В следующем примере будут записываться все запросы на сборку на консоль сервера в реальном времени.

Meteor.startup(     
  function () {     
    var wrappedFind = Meteor.Collection.prototype.find;     

    // console.log('[startup] wrapping Collection.find')        

    Meteor.Collection.prototype.find = function () {        
      // console.log(this._name + '.find', JSON.stringify(arguments))       
      return wrappedFind.apply(this, arguments);        
    }       
  },        

  function () {     
    var wrappedUpdate = Meteor.Collection.prototype.update;     

    // console.log('[startup] wrapping Collection.find')        

    Meteor.Collection.prototype.update = function () {      
      console.log(this._name + '.update', JSON.stringify(arguments))        
      return wrappedUpdate.apply(this, arguments);      
    }       
  }     
);      

Наблюдатели и рабочие функции

Если цикл события Node действует как цепь велосипеда, наблюдатель на стороне сервера похож на переключатель. Это механизм передачи, который будет собираться в сбор данных по мере поступления данных. Он может быть очень эффективным, так как у всех гоночных велосипедов есть переключатели. Но это также источник для разрушения всей системы. Это высокоскоростная реактивная функция, которая может взорвать вас. Имейте в виду.

Meteor.startup(function(){
  console.log('starting worker....');

  var dataCursor = Posts.find({viewsCount: {$exists: true}},{limit:20});

  var handle = dataCursor.observeChanges({
    added: function (id, record) {
      if(record.viewsCount > 10){
         // run some statistics
         calculateStatistics();

         // or update a value
         Posts.update({_id: id}, {$set:{
           popular: true
         }});

      }
    },
    removed: function () {
      console.log("Lost one.");
    }
  });
});

Обратите внимание, что предел 20 - это размер переключателя ... сколько зубов у него; или, точнее, сколько предметов находится в курсоре, поскольку оно идет по коллекции. Будьте осторожны с использованием ключевого слова «var» в этом виде функции. Запишите как можно меньше объектов в память и сосредоточьтесь на повторном использовании объектов внутри добавленного метода. Когда opslog включен, и эта вещь идет полным ходом, это главный кандидат для выявления неприятных утечек памяти, если он записывает объекты в кучу памяти быстрее, чем сборщик мусора узла способен очищать вещи.

Вышеупомянутое решение не будет масштабироваться горизонтально, потому что каждый экземпляр Meteor будет пытаться обновить одну и ту же запись. Таким образом, для такого масштабирования горизонтально требуется какое-то определение окружающей среды.

См. Пакет percolatestudios:synced-cron для отличного примера синхронизации рабочих сервисов на нескольких компьютерах в кластере.
Метеор-синхронизируются-хрон



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow