Hi guys,
I kind of gave up an denormalization (Who would be interested in a denormalization-package for SimpleSchema & Collection 2?) and I am now searching for a SIMPLE and FAST way to implement a searchable joint table-view in meteor.
Basically I’d like to show a list of posts and give the user the option to search by the following:
- search the post-text (field “text” in collection “Posts”)
- search the comment-text (field “text” in collection “Comments”)
- search the author-name (field “name” in collection “Author”)
Does anyone have experience with this kind of stuff? What packages/strategies can you recon?
This is the data-schema as an overview
This is how the UI is supposed to look like
This is how the collections are hooked up (using SimpleSchema)
Plus I also attached my current publication where I join the data for the client.
collections
export const Posts = new Mongo.Collection('posts')
export const Comments = new Mongo.Collection('comments')
export const Authors = new Mongo.Collection('authors')
Authors.attachSchema(new SimpleSchema({
author: {
type: String,
},
}))
Comments.attachSchema(new SimpleSchema({
comment: {
type: String,
},
postId: {
type: String,
optional: true,
},
}))
Posts.attachSchema(new SimpleSchema({
post: {
type: String,
},
authorId: {
type: String,
optional: true,
},
commentIds: {
type: [String],
optional: true,
},
}))
publication
// peerlibrary:meteor-reactive-publish
Meteor.publish('all-posts-with-comments-and-authors', function () {
this.autorun(function (computation) {
const posts = Posts.find({})
// aggregate authors and comments
const authorIds = []
let commentIds = []
posts.forEach(function (post) {
authorIds.push(post.authorId)
commentIds = _.union(commentIds, post.commentIds)
})
const authors = Authors.find({ _id: { $in: authorIds } })
const comments = Comments.find({ _id: { $in: commentIds } })
// return multiple cursors
return [posts, authors, comments]
})
})