As you might have seen, NoSQL is all about compromises based on usage scenarios. At some point, you will have to write views and queries, and there is no one design that fits all.
In your scenario, you have said that each Feed will have only the latest 50 Articles, so the articles will get quickly irrelevant (and so does any data that is associated with them). So if you store the tags in the User model, you will have to update the user object three times: 1
when user tags an article, 2
when user removes a tag, and 3
when the article gets stale and deleted. 3
is inevitable.
Its better to store tags in the Article, so that they get deleted along with the Article.
Feeds
- Name
- Last Updated
Articles
- FeedId
- Title
- Text
- Tags: { "tag-1" : [ "user1", "user2", ... ], "tag2" : [ "user3", "user4", ... ] }
Users
- id
- Feeds: [feed1, feed2]
You can see that I'm storing tags grouped by user. You could also do the reverse { "user1" : "tag1", "user2" : "tag1", "user3" : "tag2", "user4" : "tag2", ... }
if you believe that this helps processing (based on your filtering requirements).