How to reference collections or atlernatives


#1

I am new to Meteor and MongoDB (just noSQL in general). I’m doing my best to wrap my mind around non-relational data but I’m struggling.

I am trying to build a Project Manager but can’t figure out the best way to associate members to teams. These would be a many-to-many relation in a relational-design.

What is the best way to accomplish this? Or is MongoDB not a good fit?


#2

You can just store _id references like so:

{
    _id: "u6xnCKNoBgrcvXdTr",
    name: "Alpha Team",
    members: ["MkD2gQWfyeM3bp5Tp", "6jFaLmxNNnKLRArEL"]
}

Where members contains an array of the userId of users belonging to that team. Now you can look up which teams a user belongs to, by simply querying on the members field (or you can use $elemMatch).

let myTeams = Teams.find({ members: Meteor.userId() }).fetch();

Then if you are accessing this info very often you can make further optimisations using collection-hooks to add/remove teamIds to the user documents that are associated with a particular team when it is created/updated/removed.


#3

Thanks for the feedback! I was thinking I would need to supply the user IDs in the team documents as well as team IDs in the user docs.


#4

@zachjohnson also checkout Collection Hooks for de-normalizing data to the other collection(s) automatically. I tend to put those right under where the collection is defined so it’s easy to see what gets saved in one place.

https://github.com/matb33/meteor-collection-hooks
https://www.discovermeteor.com/blog/a-look-at-meteor-collection-hooks/

This may be helpful too in some cases:
https://www.eventedmind.com/feed/meteor-how-to-publish-a-many-to-many-relationship