HI everyone!
I’m following this thread because matches with my current issue…
In my case I have one Mongo Collection for tv series and two server publication methods:
1.- One publication method is for searching records and outputs filtered by a searchterm query.
2.- Second publication method is for output the most new series available on tv.
My current problem is related to merging. In my client subscriptions I have one for search results and other for new series available but only in my searc results subscription is getting the data from the newseries publication, why this happenning if each subscription is paried with each publication. Shall I use another way to avoid this merging…
First:
Inside… SimpleSearchResults.js I have subsSeries subscribing to moviedb.series.search but I’m getting merged results from NewSeries publication… explained down below…
import SeriesCol from '../../../api/Series/series';
const SimpleSearchResults = ({ loading, seriesList, peliculasList, searchTerm }) => (
<div className="search-list">
[... react component user search output ...]
</div>
);
SimpleSearchResults.propTypes = {
loading: PropTypes.bool.isRequired,
seriesList: PropTypes.arrayOf(PropTypes.object).isRequired,
peliculasList: PropTypes.arrayOf(PropTypes.object).isRequired,
searchTerm: PropTypes.string.isRequired
};
export default createContainer(( { searchQuery } ) => {
const subsSeries = Meteor.subscribe('moviedb.series.search',searchQuery.get());
const subsPeliculas = Meteor.subscribe('moviedb.peliculas.search',searchQuery.get());
let subsReady = (subsSeries.ready() && subsSeries.ready()) ? true : false;
return {
loading: !subsReady,
seriesList: SeriesCol.find().fetch(),
peliculasList: PeliculasCol.find().fetch(),
searchTerm: searchQuery.get()
};
}, SimpleSearchResults);
Second:
Inside imports/api/Series/server/publications.js I am publishing two types of outputs from the same mongo db collection series
import series from '../series';
Meteor.publish('moviedb.series.search',(searchTerm) => {
check(searchTerm, Match.OneOf(String, null, undefined));
let query = {};
const projection = {limit: 1, sort: { name:1 } };
if(searchTerm){
const regex = new RegExp(searchTerm, 'i');
query = {
$or: [
{name: regex},
{original_name: regex}
],
};
projection.limit = 10;
}
return series.find(query, projection);
});
Meteor.publish('moviedb.series.NewSeries', () => {
let gte_date = `${currentYear}-${currentMonth}-1`;
let lt_date = `${currentYear}-${currentMonth}-${daysInMonth}`;
let query = {
first_air_date: {
$gte: firstDateOfMonth,
$lt: lastDateOfMonth
},
vote_average: {
$gte: 6.0,
$lt: 10.0,
}
};
const projection = {limit: 40, sort: { popularity: -1 } };
return series.find(query, projection);
});
Third
… in NewSeries.js component I’m subscribing to ‘moviedb.series.NewSeries’ and it works properly.
import { Meteor } from 'meteor/meteor';
import React from 'react';
import PropTypes from 'prop-types';
import { createContainer } from 'meteor/react-meteor-data';
import Loading from '../../components/Loading/Loading';
import SeriesCol from '../../../api/Series/series';
const NewSeries = ({ loading, sectionTitle, seriesList}) => (
<section>
<h1>{sectionTitle} - Resultados: {seriesList.length} </h1>
<ul>
{seriesList.map( ({ id, name, first_air_date, popularity, vote_average}) => (
<li key={id}>
{name} - {first_air_date} - popularity: {popularity} - vote_average: {vote_average}
</li>
))}
</ul>
</section>
);
NewSeries.propTypes = {
sectionTitle: PropTypes.string.isRequired,
};
export default createContainer(() => {
const subs = Meteor.subscribe('moviedb.series.NewSeries');
return {
loading: !subs.ready(),
seriesList: SeriesCol.find().fetch()
};
}, NewSeries);
How could I avoid getting merged results from both publications ‘moviedb.series.NewSeries’ & ‘moviedb.series.search’ ??
… I would like to do not get newseries query inside my search output… sorry for the length of this post I’m pretty sure this is a really newbie issue for pub/sub design patterns.
Thanks in advance for any advise!!!
Roger