Отфильтрованная по метеору публикация с ограничением и пропуском с общим количеством - PullRequest
0 голосов
/ 27 февраля 2019

С учетом отфильтрованной и разбитой на страницы публикации метеора, как мне получить общее количество с примененной отфильтрованной информацией?

Код клиента:

import { Meteor } from 'meteor/meteor';
import { Template } from 'meteor/templating';
import { Track } from 'meteor/tracker';

import { Posts } from '/imports/api/posts/posts.js';

import './posts.html';

Template.App_posts.onCreated(function() {
  this.subscribe('posts.all', new Date(), 0);

  Tracker.autorun(() => {
    let postCount = Posts.find({}).count();
    console.log(postCount); // 10
  });
});

Код сервера:

import { Meteor } from 'meteor/meteor';
import { check } from 'meteor/check';

import { Posts } from '../posts.js';

const postsPerPage = 10;

Meteor.publish('posts.all', function(date, page = 0) {
  if (!Meteor.userId()) throw new Meteor.Error('Unauthorised');

  check(date, Date);
  check(page, Number);

  let query = {
    userId: Meteor.userId()
  };

  let options = {};

  if (date) {
    query.createdAt = date;
  }

  options.limit = postsPerPage;
  options.skip = page * postsPerPage;

  let cursor = Posts.find(query, options);

  console.log(cursor.count()); // 100

  return cursor;
});

Возвращает ожидаемые сообщения с указанием даты и страницы, но проблема заключается в том, что общее количество отфильтрованных сообщений известно.

При условии, что имеется 1000 сообщений, 100 из них применимы к этой дате и пользователю.Как получить счет 100, если за раз возвращаются только 10?

1 Ответ

0 голосов
/ 27 февраля 2019

Я думаю, что вы должны использовать tmeasday: publish-countts https://github.com/percolatestudio/publish-counts

На сервере вы должны сделать:

Meteor.publish('posts.numberOfPosts', function(date) {
   if (!this.userId){
       return this.ready();
   } 
   check(date, Date);

   let query = {
      userId: this.userId
   };
   if (date) {
     query.createdAt = date;
   }
   Counts.publish(this, 'all-posts', Posts.find(query));
}

И на клиенте: Counts.get ('All-orders ')

На самом деле, вы также можете разместить эту подписку внутри "posts.all":

Meteor.publish('posts.all', function(date, page = 0) {
  if (!Meteor.userId()) throw new Meteor.Error('Unauthorised');

  check(date, Date);
  check(page, Number);

  let query = {
    userId: Meteor.userId()
  };

  let options = {};

  if (date) {
    query.createdAt = date;
  }

  options.limit = postsPerPage;
  options.skip = page * postsPerPage;

  let cursor = Posts.find(query, options);
  // https://github.com/percolatestudio/publish-counts#noready
  Counts.publish(this, 'all-posts', Posts.find(query), {noReady: true});

  return cursor;
});
...