EDIT : cette question, certaines des réponses et certains des commentaires contiennent beaucoup de fausses informations. Voir comment fonctionnent les collections, les publications et les abonnements de Meteor pour bien comprendre comment publier et s'abonner à plusieurs sous-ensembles de la même collection de serveurs.
Comment faire pour publier différents sous-ensembles (ou "vues") d'une même collection sur le serveur en tant que collections multiples sur le client ?
Voici un pseudo-code pour illustrer ma question :
items
collection sur le serveur
Supposons que j'ai un items
collection sur le serveur avec des millions d'enregistrements. Supposons également que :
- 50 enregistrements ont le
enabled
la propriété est réglée surtrue
et ; - 100 enregistrements ont le
processed
la propriété est réglée surtrue
.
Tous les autres sont réglés sur false
.
items:
{
"_id": "uniqueid1",
"title": "item #1",
"enabled": false,
"processed": false
},
{
"_id": "uniqueid2",
"title": "item #2",
"enabled": false,
"processed": true
},
...
{
"_id": "uniqueid458734958",
"title": "item #458734958",
"enabled": true,
"processed": true
}
Code du serveur
Publions deux "vues" de la même collection de serveurs. L'une enverra un curseur avec 50 enregistrements, et l'autre un curseur avec 100 enregistrements. Il y a plus de 458 millions d'enregistrements dans cette base de données fictive côté serveur, et le client n'a pas besoin de tous les connaître (en fait, les envoyer tous prendrait probablement plusieurs heures dans cet exemple) :
var Items = new Meteor.Collection("items");
Meteor.publish("enabled_items", function () {
// Only 50 "Items" have enabled set to true
return Items.find({enabled: true});
});
Meteor.publish("processed_items", function () {
// Only 100 "Items" have processed set to true
return Items.find({processed: true});
});
Code client
Afin de supporter la technique de compensation de latence, nous sommes obligés de déclarer une seule collection Items
sur le client. La faille devrait devenir évidente : comment faire la différence entre Items
para enabled_items
y Items
para processed_items
?
var Items = new Meteor.Collection("items");
Meteor.subscribe("enabled_items", function () {
// This will output 50, fine
console.log(Items.find().count());
});
Meteor.subscribe("processed_items", function () {
// This will also output 50, since we have no choice but to use
// the same "Items" collection.
console.log(Items.find().count());
});
Ma solution actuelle implique monkey-Parcheando _publishCursor pour permettre d'utiliser le nom de l'abonnement au lieu du nom de la collection. B
// On the client:
var EnabledItems = new Meteor.Collection("enabled_items");
var ProcessedItems = new Meteor.Collection("processed_items");
Avec le "monkey-patch" en place, ça va marcher. Mais si vous passez en mode hors ligne, les changements n'apparaîtront pas immédiatement sur le client - il faudra être connecté au serveur pour les voir.
Quelle est l'approche correcte ?
EDIT : Je viens de revoir ce fil de discussion et je me rends compte qu'en l'état actuel des choses, ma question, mes réponses et la pléthore de commentaires véhiculent beaucoup d'informations erronées.
En fait, j'ai mal compris la relation entre la publication et l'abonnement. Je pensais que lorsque vous publiiez un curseur, il atterrissait sur le client comme une collection distincte des autres curseurs publiés provenant de la même collection du serveur. Ce n'est tout simplement pas comme cela que cela fonctionne. L'idée est que le client et le serveur ont les mêmes collections, mais c'est ce qui est le plus important. sur les collections qui diffèrent. Les contrats pub-sub négocient quels documents finissent chez le client. La réponse de Tom est techniquement correcte, mais il manquait quelques détails pour renverser mes hypothèses. J'ai répondu à une question similaire à la mienne dans un autre fil de discussion de SO en me basant sur l'explication de Tom, mais en gardant à l'esprit mon incompréhension initiale de la pub-sub de Meteor : Stratégies Meteor de publication/abonnement pour les collections uniques côté client
J'espère que cela aidera ceux qui sont tombés sur ce fil et qui en ressortent plus confus qu'autre chose !