La colección Meteor no actualiza la suscripción en el cliente

Soy bastante nuevo en Meteor y Mongo y, aunque no lo quiera, necesito algunas relaciones.

Tengo una Colección llamada Feeds y otra llamada UserFeeds donde tengo un feedid y un ID de usuario, y publico los feeds de usuario en el server de esta manera:

Meteor.publish('feeds', function(){ return Feeds.find({_id:{$in:_.pluck(UserFeeds.find({user:this.userId}).fetch(),'feedid')}}); }); 

Encuentro al usuario en UserFeeds, lo recojo (devuelve una matriz) y lo arranco para tener solo el campo de feedid, y luego encuentro esos feeds en la colección de Feeds.

Y suscríbase al cliente así:

 Deps.autorun(function(){ Meteor.subscribe("feeds"); }); 

El problema es que cuando agrego un nuevo feed y un nuevo userfeed, el cliente no recibe el cambio, pero cuando actualizo la página aparece el nuevo feed.

¿Alguna idea de lo que me estoy perdiendo aquí?

Gracias.

Me he encontrado con esto, también. Resulta que las funciones de publicación en el server no se vuelven a ejecutar de manera reactiva: si devuelven un cursor de Colección, como está haciendo (y como la mayoría de las funciones de publicación lo hacen), la function de publicación se ejecutará una vez y Meteor almacenará el cursor y envíe las actualizaciones solo cuando el contenido del cursor cambie. Lo importante aquí es que Meteor no volverá a ejecutar la function de publicación, ni, por lo tanto, Collection.find(query) , cuando cambie la query . Si desea que la function de publicación se vuelva a ejecutar, la forma en que lo he hecho hasta ahora es configurar la function de publicación para recibir un argumento. De esta forma, el cliente, cuyas collections se actualizan de manera reactiva, puede volver a suscribirse de forma reactiva. El código sería algo así como:

 // client Meteor.subscribe('user_feeds'); Deps.autorun(function(){ var allFeeds = UserFeeds.find({user: Meteor.userId()}).fetch(); var feedIds = _.pluck(allFeeds,'feedid'); Meteor.subscribe('feeds',feedids); }); // server Meteor.publish('feeds',function(feedids) { return Feeds.find({_id: {$in: feedids}}); }); 

Creo que el package Meteorite publicación-con-relaciones está diseñado para resolver este problema, aunque no lo he usado.

EDITAR: Creo que la function de publicación se volverá a ejecutar cuando el ID de usuario cambie, lo que significa que puede tener una verificación en el server para asegurarse de que el usuario está conectado antes de publicar datos confidenciales.

Creo que tu problema es que .fetch () que usas aquí …

 UserFeeds.find({user:this.userId}).fetch() 

… elimina la reactividad.

.fetch () devuelve una matriz en lugar de un cursor, y esa matriz no será reactiva.

http://docs.meteor.com/#fetch

testing esto …

 Meteor.autosubscribe(function(){ Meteor.subscribe("feeds"); }); 

y en la Plantilla JS …

 Template.templateName.feeds = function() return Feeds.find() # or any specific call }; 

en el HTML …

 {{#each feeds}} do some stuff {{else}} no feed {{/each}} 

Puede usar el package de publicación reactiva (soy uno de los autores). Le permite crear puntos finales de publicación que dependen del resultado de otra consulta. En su caso, consulta en UserFeeds .

 Meteor.publish('feeds', function () { this.autorun(function (computation) { var feeds = _.pluck(UserFeeds.find({user: this.userId}, {fields: {feedid: 1}}).fetch(), 'feedid'); return Feeds.find({_id: {$in: feeds}}); }); }); 

La parte importante es que limite los campos UserFeeds solo a feedid para asegurarse de que la autorun no se vuelva a ejecutar cuando otro campo cambie en UserFeeds , un campo que no le importa.