Zoeken…
Opmerkingen
Een handige manier om na te denken over Mongo-collecties is in termen van wie, wat, wanneer, waar, waarom en hoe. Mongo heeft de volgende optimalisaties voor verschillende soorten gegevens:
Waar - GeoJSON
Wanneer - ObjectID tijdstempels
Wie - Meteor Account Strings
Hoe - JSON voor beslissingsbomen
Dat laat het standaarddocument in Mongo ruwweg een 'Wat' vertegenwoordigen.
Records maken in een oude database
U kunt standaard de standaard Mongo-indeling gebruiken door uw collecties te definiëren met het veld idGeneration.
MyCollection = new Meteor.Collection('mycollection', {idGeneration : 'MONGO'});
Gegevens invoegen in een document
Veel beginners in Mongo worstelen met de basis, zoals het invoegen van een array, date, boolean, sessievariabele, enzovoort in een documentrecord. Dit voorbeeld biedt enige richtlijnen voor basisgegevensinvoer.
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
});
De _id krijgen van het meest recent gemaakte document
Je kunt het synchroon krijgen:
var docId = Todos.insert({text: 'foo'});
console.log(docId);
Of asynchroon:
Todos.insert({text: 'foo'}, function(error, docId){
console.log(docId);
});
Tijdreeksgegevens
Het gebruik van MongoDB voor tijdreeksgegevens is een zeer goed document en gevestigde use-case, met officiële whitepapers en presentaties. Lees en bekijk de officiële documentatie van MongoDB voordat u uw eigen schema's voor tijdreeksgegevens probeert uit te vinden.
MongoDB voor tijdreeksgegevens
Over het algemeen wilt u 'emmers' maken voor uw tijdreeksengegevens:
DailyStats.insert({
"date" : moment().format("MM-DD-YYYY"),
"dateIncrement" : moment().format("YYYYMMDD"),
"dailyTotal" : 0,
'bucketA': 0,
'bucketB': 0,
'bucketC': 0
});
En verhoog die emmers vervolgens als gegevensfeeds in uw toepassing. Deze toename kan in een Meteor-methode, een verzamelobservator, een REST API-eindpunt en verschillende andere plaatsen worden geplaatst.
DailyStats.update({_id: doc._id}, {$inc: {bucketA: 1} });
Voor een completer Meteor-voorbeeld, zie de voorbeelden uit de Clinical Meteor-track:
Realtime Analytics-pijplijn
Clinical Meteor - Grafieken - Dagstatistieken
Filteren met regexen
Eenvoudig patroon voor het filteren van abonnementen op de server, met behulp van regexen, reactieve sessievariabelen en deps autoruns.
// 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});
});
});
En de HTML die wordt gebruikt op de client:
<input id="dictionarySearchInput" type="text" placeholder="Filter..." value="hello"></input>
Dit patroon zelf is vrij eenvoudig, maar de regexen misschien niet. Als u niet bekend bent met regexes, zijn hier enkele handige tutorials en links:
Regulier Expression Tutorial
Cheatsheet voor reguliere expressie
Reguliere uitdrukkingen in Javascript
Geospatiale collecties - meer leren
Geospatial collecties omvatten in het algemeen het opslaan GeoJSON in de Mongo database, het streamen van die gegevens aan de klant, de toegang tot de browser window.navigator.geolocation
, het laden van een Map API, het omzetten van GeoJSON om LatLngs en plotten op de kaart. Bij voorkeur allemaal in realtime. Hier is een lijst met bronnen om u op weg te helpen:
- mongodb slaat zijn gegevens optimaal op in geoJSON
- geojson.org
- window.navigator.geolocation
- HTML-geolocatie
- Maps API-kiezer
- google.maps.LatLng
- Google map.data.loadGeoJson
- meteoor-Cordova-geolocatie-achtergrond
- PhoneGap-googlemaps-plugin
- lengte- en breedtegraad
- maps.documentation
- google.maps.LatLng
- 2D-indexen
- maak een 2dsphere-index
- query een 2dsphere-index
- georuimtelijke indexen en zoekopdrachten
Zoekopdrachten van collecties controleren
In het volgende voorbeeld worden al uw verzamelquery's in realtime bij de serverconsole vastgelegd.
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);
}
}
);
Waarnemers en werknemersfuncties
Als de knoop van de knooppuntgebeurtenis werkt als een fietsketting, is de waarnemer van de serverzijde een derailleur. Het is een tandwielmechanisme dat in de gegevensverzameling gaat zitten wanneer de gegevens binnenkomen. Het kan zeer performant zijn, omdat alle racefietsen derailleurs hebben. Maar het is ook een bron voor het doorbreken van het hele systeem. Het is een snelle reactieve functie die je kan opblazen. Wees gewaarschuwd.
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.");
}
});
});
Let op de limiet van 20 is de grootte van de derailleur ... hoeveel tanden heeft het; of, meer specifiek, hoeveel items er in de cursor zijn terwijl deze over de collectie loopt. Wees voorzichtig met het gebruik van het trefwoord 'var' in dit soort functies. Schrijf zo weinig mogelijk objecten in het geheugen en richt u op het hergebruik van objecten binnen de toegevoegde methode. Wanneer de opslog is ingeschakeld en dit ding op volle snelheid gaat, is het een uitstekende kandidaat voor het blootleggen van vervelende geheugenlekken als het voorwerpen sneller op de geheugenhoop noteert dan de Node-vuilnisman dingen kan opruimen.
De bovenstaande oplossing kan niet horizontaal goed worden geschaald, omdat elke Meteor-instantie hetzelfde record probeert bij te werken. Er is dus een soort omgevingsdetectie nodig om horizontaal te schalen.
Zie de percolatestudios:synced-cron
pakket voor een uitstekend voorbeeld van het synchroniseren van servicemedewerkers op meerdere machines in een cluster.
-meteoor gesynchroniseerd-cron