Поиск…
замечания
Полезный способ подумать о коллекциях Монго в терминах 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 и построение графика на карте. Предпочтительно все в режиме реального времени. Вот список ресурсов, которые помогут вам начать работу:
- mongodb оптимально сохраняет свои данные в geoJSON
- geojson.org
- window.navigator.geolocation
- Геолокация HTML
- API карт API
- google.maps.LatLng
- Google map.data.loadGeoJson
- Метеор-Cordova-геолокации-фон
- PhoneGap-GoogleMaps-плагин
- LatLng
- maps.documentation
- google.maps.LatLng
- Индексы 2dsphere
- создать индекс 2dsphere
- запросить индекс 2dsphere
- геопространственные индексы и запросы
Запросы аудиторской коллекции
В следующем примере будут записываться все запросы на сборку на консоль сервера в реальном времени.
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
для отличного примера синхронизации рабочих сервисов на нескольких компьютерах в кластере.
Метеор-синхронизируются-хрон