How do I create a relationship?


#1

This has probably been asked a lot but I can’t find a straight answer. How do you make/write a simple one-to-many relationship in meteor?


#2

I believe this package is the most popular method:


#3

So I need a package? It doesn’t work out of the box?


#4

Not at all, though you’d need to make your own “implementation” - This is the method I use:

Meteor.publish("pubName", function(id1) {
  // Use low-level API for transform/join functionality   
  var self = this; // Store context here
  var query = collection1.find({_id: id1});
  var obs = query.observeChanges({
    added: function(id1, doc) {
      // Get relation data from a newly added document
      var id2 = doc.id2;
      // Find the related document and retrive required data
      // then add it to the new document (via "doc.data")
      doc.data = collection2.findOne({_id: id2}).data;
      self.added('dbName', id1, doc);
    },
    changed: function(id, doc) {
      self.changed('dbName', id1, doc);
    },
    removed: function() {
      self.removed('dbName', id1);
    }
  })
  // Call ready to register publication
  this.ready();

  this.onStop(function() {
    // Stop observing the cursor when client unsubs.
    obs.stop();
  })
});

More info:
http://docs.meteor.com/#/full/meteor_publish (The low-level API section)
http://richsilv.github.io/meteor/meteor-low-level-publications/

Edit: Note that “dbName” should be whatever goes in this part in bold:
Collection = new Mongo.Collection(“dbName”)


#5

https://www.discovermeteor.com/blog/reactive-joins-in-meteor/ Might help also


#6

I think it’s fair to mention this is because MongoDB is not a relational database and has nothing to do with Meteor itself. This is the main reason this functionality doesn’t come out of the box.

If for example you used a MySQL driver instead of the default MongoDB one, you could do proper joins.


#7

I see. Good to know.


#8

Installed dburles:collection-helpers. Works great.