Отфильтрованная по метеору публикация с ограничением и пропуском с общим количеством
Учитывая публикацию отфильтрованного и разбитого на страницы метеора, как мне получить общее количество с примененным отфильтрованным?
Код клиента:
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 ответ
Решение
Я думаю, что вы должны использовать 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("Все заказы")
На самом деле, вы также можете разместить эту подписку внутри "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;
});