Meteor publie / abonne les stratégies pour les collections uniques du client

À l'aide de Meteor, je me demande la meilleure façon de gérer différentes collections côté client qui partagent la même collection de base de données côté serveur. Considérons l'exemple suivant: j'ai une collection d' User et, de mon côté client, j'ai une liste d'utilisateurs amis et j'ai une fonction de recherche qui effectue une requête sur la base de données entière des utilisateurs, renvoyant une liste de noms d'utilisateur qui correspondent à la Requête .

Sur la méthode Publish server-side, j'ai deux requêtes contre la même collection qui renvoient différents ensembles de documents. Est-ce que ces données devraient être intégrées dans deux collections distinctes du client? Ou tous les documents utilisateur qui correspondent aux deux requêtes se retrouvent dans la même collection? Si ce dernier, puis-je copier le code utilisé pour la requête côté serveur et côté client?

Sur le serveur:

 Meteor.publish('searchResults', function(query){ var re = new RegExp(query, 'i') return Users.find({ 'name' : {$regex: re}}) }) 

Sur le client:

 Session.set('searchQuery', null) Meteor.autosubscribe(function(){ Meteor.subscribe('searchResults', Session.get('searchQuery')) }) Template.search.events = { 'keyup #user-search' : function(e){ Session.set('searchQuery', e.target.value) } } _.extend(Template.search, { searchResults: function() { var re = new RegExp(Session.get('searchQuery'), 'i') return Users.find({ 'name' : {$regex: re}}) } }) 

Cela semble être une solution plausible, mais pas optimale. Et si je voulais créer une nouvelle collection côté client qui consistait en des résultats de recherche provenant de plusieurs collections côté serveur

    Dans une zone partagée:

     function getSearchUsers(query) { var re = new RegExp(query, "i"); return Users.find({name: {$regex: re}}); } function getFriendUsers() { return Users.find({friend: true}); // or however you want this to work } 

    Sur le serveur:

     Meteor.publish("searchUsers", getSearchUsers); Meteor.publish("friendUsers", getFriendUsers); 

    Sur le client:

     Template.search.onCreated(function () { var self = this; self.autorun(function () { self.subscribe("searchUsers", Session.get("searchQuery")); }); }); Template.friends.onCreated(function () { this.subscribe("friendUsers"); }); Template.search.helpers({ searchResults: function () { return getSearchUsers(Session.get("searchQuery")); } }); Template.friends.helpers({ results: function () { return getFriendUsers(); } }); 

    La clé à emporter est que ce qui se passe derrière les scènes lorsque les données sont transférées sur le fil n'est pas évident. Meteor semble combiner les enregistrements qui correspondaient aux différentes requêtes sur le serveur et l'envoyer au client. C'est alors que le client lance la même requête pour les diviser.

    Par exemple, disons que vous avez 20 enregistrements dans une collection côté serveur. Vous disposez alors de deux publications: la première correspond à 5 enregistrements, la seconde correspond à 6, dont 2 sont identiques. Meteor enverra 9 enregistrements. Sur le client, vous exécutez les requêtes exactes exactes que vous avez effectuées sur le serveur et vous devriez terminer avec 5 et 6 enregistrements respectivement.

    Je suis un peu en retard pour la fête, mais il existe une façon d'avoir des collections distinctes sur le client pour les sous-ensembles d'une collection de serveurs. Dans cet exemple, j'ai une collection de serveurs appelée entities qui contient des informations sur les polygons et les rectangles .
    Code partagé (dossier lib):

     // main collection (in this example only needed on the server Entities = new Meteor.Collection('entities'); // partial collections RectEntities = new Mongo.Collection('rectEntities'); PolyEntities = new Mongo.Collection('polyEntities'); 

    Code client:

     // this will fill your collections with entries from the Entities collection Meteor.subscribe('rectEntities'); Meteor.subscribe('polyEntities'); 

    N'oubliez pas que le nom de l'abonnement doit correspondre au nom de la publication (mais pas au nom de la collection elle-même)
    Code serveur:

     Meteor.publish('rectEntities', function(){ Mongo.Collection._publishCursor( Entities.find({shapeType: 'rectangle'}), this, 'rectEntities'); this.ready(); }); Meteor.publish('polyEntities', function(){ Mongo.Collection._publishCursor( Entities.find({shapeType: 'polygon'}), this, 'polyEntities'); this.ready(); }); 

    Merci à user728291 pour la solution beaucoup plus simple en utilisant _publishCursor() !
    Le troisième argument de la fonction _publishCursor() est le nom de votre nouvelle collection.
    Source: http://docs.meteor.com/#/full/publish_added

    Utiliser le paquet publier-composite

     // main collection Entities = new Meteor.Collection('entities'); // partial collections only client side RectEntities = new Mongo.Collection('rectEntities'); PolyEntities = new Mongo.Collection('polyEntities'); // server publish Meteor.publishComposite("rectEntities", function(someParameter) { return { collectionName:'rectEntities', find: function() { return Entities.find({shapeType: 'rectangle'}); }, children: [] } }); Meteor.publishComposite("polyEntities", { collectionName:'polyEntities', find: function() { return Entities.find({shapeType: 'polygon'}); }, children: [] }); 

    Source: http://braindump.io/meteor/2014/09/20/publishing-to-an-alternative-clientside-collection-in-meteor.html