Meteor Collection Transform: est-ce fait sur le serveur ou sur le client? Ou cela dépend

Je veux utiliser la transformation pour créer un «champ virtuel» d'une collection. Cependant, le nouveau champ que j'ajoute (dans la fonction de transformation) ajoute un peu de données au document renvoyé.

C'est bien si la transformation se déroule à l'intérieur du client. Si cela se fait sur le côté serveur, il y aura des problèmes de bande passante.

Je me demande donc si la transformation se fait sur le serveur ou sur le client, ou cela dépend de la façon dont je trouve / récupère le document?

MISE À JOUR : Il est possible de faire une transformation sur le serveur.

Vous pouvez avoir une transformation sur le client comme ceci:

 return YourCollection.find({}, {transform: function (doc) { doc.test = true; return true; }}); 

Meteor ignore la transform sur les requêtes qui sont publiées (à partir de Meteor.publish ). Le client voit le document comme si la transformation n'existait pas.

Si vous souhaitez utiliser des transformées sur le serveur, vous pouvez le faire:

 YourCollection = new Mongo.Collection("collection_name"); Meteor.publish("yourRecordSet", function() { //Transform function var transform = function(doc) { doc.date = new Date(); return doc; } var self = this; var observer = YourCollection.find().observe({ added: function (document) { self.added('collection_name', document._id, transform(document)); }, changed: function (newDocument, oldDocument) { self.changed('collection_name', newDocument._id, transform(newDocument)); }, removed: function (oldDocument) { self.removed('collection_name', oldDocument._id); } }); self.onStop(function () { observer.stop(); }); self.ready(); }); 

Vous pouvez utiliser la transformation des deux côtés, lorsque vous spécifiez une option de transformation pour la collection ou findOne, fetch, etc.

Fonction de transformation
Une fonction de transformation facultative. Les documents seront transmis par cette fonction avant d'être renvoyés de fetch ou findOne, et avant d'être transmis aux rappels d'observation, autoriser et refuser.

Si vous devez obtenir un document brut d'une collection avec une option de transformation.

 myCollection.findOne({},{transform:null}) 

Vous pouvez ajouter et utiliser la fonction suivante:

 Meteor.publishWithTransform = function(publicationName, cursorGetter , transform) { transform = transform || function(o){return o;}; Meteor.publish(publicationName, function () { var cursor = cursorGetter.apply(this, arguments); var collectionName = cursor._cursorDescription.collectionName; var self = this; var observer = cursor.observe({ added: function (document) { self.added(collectionName, document._id, transform(document)); }, changed: function (newDocument, oldDocument) { self.changed(collectionName, newDocument._id, transform(newDocument)); }, removed: function (oldDocument) { self.removed(collectionName, oldDocument._id); } }); self.onStop(function () { observer.stop(); }); self.ready(); }); } 

Utilisation (côté serveur):

 Meteor.publishWithTransform("publication-name", function () { aCollection.find({}) }, function (item) { item.aField = "something"; return item; }); 

Inconvénient: si vous enregistrez le document publié, vous allez enregistrer les modifications ajoutées. Ici, le client n'a aucune idée de la propriété "aField" a été ajouté lors de la publication.

Vous pouvez également ajouter directement la transformation dans la définition de la collection. Remarque: Comme mentionné ci-dessus, cela risque de stocker des données supplémentaires dans votre collection lors de la mise à jour. Pour les collections en lecture seulement, ce n'est pas vraiment un problème.

Je m'attends également à ce que cela se produise dans un dossier de partage ou similaire, tant client que serveur, voient cette définition.

 var Assignment; // Every record in this collection will now be an // instance of the Assignment class. this.AssignmentsReport = new Mongo.Collection("assignments", { transform: function(doc) { return new Assignment(doc._id, doc.assignId, doc.masterId); } }); // Creating a class instance to actually map the new object. Assignment = (function() { function Assignment(_id, assignId, masterId) { var assign, ref; this._id = _id; this.assignId = assignId; this.masterId = masterId; this.assign = (ref = Assignments.find({ _id: this.assignId }).fetch()) != null ? ref[0] : void 0; } return Assignment; })(); 

Il existe également un paquet de météores qui permet d'ajouter des transformations sur le côté serveur pour publier https://atmospherejs.com/maximum/server-transform