Сортировка публикаций метеора

У меня есть приложение Meteor-react, которое содержит коллекцию с большим количеством данных. Я показываю данные с нумерацией страниц.
На стороне сервера я просто публикую данные для текущей страницы.

Итак, я публикую некоторые данные на стороне сервера:

Meteor.publish('animals', function(currPage,displayPerPage, options) {
  const userId = this.userId;
  if (userId) {
    const currentUser = Meteor.users.findOne({ _id: userId });
    let skip = (currPage - 1) * displayPerPage;
    if (displayPerPage > 0) {
      Counts.publish(this, 'count-animals', Animals.find(
        {$and: [
          // Counter Query
        }
      ), {fastCount: true});

  return Animals.find(
     {$and: [
       // Data query
     ]}, {sort: options.sortOption, skip: skip, limit: displayPerPage });
     } else {
       Counts.publish(this, 'count-animals', 0);
       return [];
     }
  }
});


А на стороне клиента я использую трекер:

export default AnimalsContainer = withTracker(({subscriptionName, subscriptionFun, options, counterName}) => {
  let displayPerPage = Session.get("displayPerPage");
  let currPage = Session.get("currPage");
  let paginationSub = Meteor.subscribe(subscriptionName, currPage, displayPerPage, options );
  let countAnimals = Counts.get(counterName);
  let data = Animals.find({}).fetch({});
  // console.log(data);
  return {
    // data: data,
    data: data.length <= displayPerPage ? data : data.slice(0, displayPerPage),
    countAnimals: countAnimals,
  }
})(Animals);


Проблема в следующем:

Когда я пытаюсь изменить параметры сортировки на стороне клиента, сервер сортирует не из первых данных (некоторые пропускают первые). Иногда с 20-го, иногда с 10-го. Проверка типа выполняется с обеих сторон.


person peter    schedule 23.05.2018    source источник
comment
Counts.publish имеет отношение к вашему вопросу?   -  person Michel Floyd    schedule 23.05.2018
comment
Это не должно быть релевантным, потому что это просто подсчет.   -  person peter    schedule 23.05.2018
comment
Имейте в виду, что когда вы используете sort + limit, другая сортировка может радикально изменить опубликованные документы. Если вы хотите сортировать только документ, полученный клиентом, вы должны выполнять сортировку на стороне клиента, а не на стороне сервера.   -  person Gaëtan Rouziès    schedule 24.05.2018
comment
Спасибо за информацию, но мне нужно сортировать на стороне сервера, а также приходится ограничивать его со стороны сервера, потому что производительность выше. (Имейте больше тысячи объектов) Я думал, что сначала должна произойти сортировка, а затем ограничение. Разве не должно?   -  person peter    schedule 24.05.2018


Ответы (1)


Две вещи, о которых я могу думать.

  1. Следите за порядком {sort: options.sortOption, skip: skip, limit: displayPerPage}. Насколько я знаю, он работает в том порядке, в котором вы его разместили. Так что сначала сортирует, потом пропускает, потом ограничивает.

  2. Делайте сортировку как на клиенте, так и на сервере. Когда сортировка происходит на сервере и передается клиенту, клиент содержит мини-версию монго, которая не гарантирует порядок. Поэтому вам нужно отсортировать и клиента.

person Kc Gibson    schedule 24.05.2018
comment
Спасибо, 1 - я знаю, вот в чем дело. Я хочу просто опубликовать только номер displayPerPerPage документа. 2 - Не очень понимаю почему, но сработало лучше. Не идеально, но с точностью 95%. (Есть немного D между W и Z, но работает намного лучше, чем раньше. ‹br/› Что меня смутило. Потому что клиент должен получить только ограниченные данные. ‹br/› Может у вас есть мнение о левых 5%? : Д - person peter; 24.05.2018
comment
Так что теперь в трекере тоже отсортировано: let data = Animals.find({}, {sort: options.sortOption} ).fetch({}); - person peter; 24.05.2018
comment
проверено на разных базах данных, и на обеих базах данных существовало то, что D между W и Z - person peter; 24.05.2018