Master detail collections > reactivity


#1

Hi,

I am working on an event app, where an exhibitor scans a QR code to checkin a visitor. Visitor data is stored in the Meteor users collection and the scan tstamp in a eventvisitors collection, with data like exhibitorId and visitorId .

In the CMS i want to retrieve the visitor data, related to the exhibitor and the checkin tstamp.

I know there are several ways to do this. One of which is to save all the data in the same collection, use a package for this … I looked into these options and decided i prefer to do it differently.

I chose to create another collection based on the data from the visitor and eventvisitors collection, being compile when subscribe to it.

I have this publication:

Meteor.publish('getExhibitorVisitors.byExhibitorId', function (exhibitorId) {
  const publication = this;
  const exportexhibitorvisitorsCursor = ExhibitorVisitors.find({ exhibitorId });
  exportexhibitorvisitorsCursor.observeChanges({
    added: function (id, exhibitorVisitor) {
      console.log('exportEventVisitors.all added', id, exhibitorVisitor);
      const user = Meteor.users.find({ _id: exhibitorVisitor.visitorId, role: 'visitor' }, {
        fields: {
          fName: 1,
          lName: 1,
          company: 1,
          contactEmail: 1,
        },
      }).fetch()[0];
      
      // keep original visitorId
      user.visitorId = exhibitorVisitor.visitorId;
      
      user.createdAt = exhibitorVisitor.createdAt;
      publication.added('exportexhibitorvisitors', Random.id(), user);
    },
    changed: function (id, exhibitorVisitor) {
      console.log('exportEventVisitors.all changed', id, exhibitorVisitor);
      // publication.changed('exporteventvisitors', id, transformExportEventVisitor(visitor));
    },
    removed: function (id) {
      console.log('exportEventVisitors.all changed', id);
      // publication.removed(id);
    },
  });
  publication.ready();
});

and client

Template.pageExhibitorView.onRendered(function onExhibitorEditRendered() {
  const data = Template.currentData();
  Meteor.subscribe('getExhibitorVisitors.byExhibitorId', data.exhibitorId);
});

Is this a good solution? As i need to keep reactivity
When i subscribe I see that it triggers the publication to be run twice on the server.

Any better ideas?