Сортировка и ограничение не работает с Монго + Метеор

Это мое publish.js файл, в котором я публикую свою коллекцию:

const tags = Tags.find({title: {
      $regex: `.*${searchString}.*`,
      $options: 'i'
    }}, {
      sort: { counts: -1 }, limit: 3
    });
    console.log(tags.count());

    return tags;

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

this.tagsSubscription = this.subscribe('tags', () => [this.tag], function (err) {
    that.tags = Tags.find().fetch();
});

Итак, с этим я получаю 2 разные ошибки:

  • сортировка и ограничение не работают: иногда я получаю более 3 результатов, а сортировка по количеству

  • обратный вызов не работает должным образом. Это слишком быстро, я получаю разные результаты на клиенте и сервере. Я пробовал таким образом, onSuccess() и с Meteor.autorun() но без удачи. Если я использую setTimeout Я вижу правильный курсор

Поиск по названию - единственное, что кажется работающим.

1 ответ

Решение

Во-первых, согласно документации, .count() будет игнорировать эффекты .skip() а также .limit()Так, например, если у вас есть 100 записей в общей сложности, и ваши параметры запроса имеют { limit: 3 } затем .count() для этого курсор вернется 100 вместо 3,

Во-вторых, глядя на ваш код, я предполагаю, что ваша публикация ожидает хотя бы один аргумент: searchString, Но ваш код, который подписывается на него, не проходит его. Я думаю, что это должно быть так:

Meteor.subscribe('tags', this.tag, () => {
  that.tags = Tags.find().fetch();
});

И, наконец, сортировка на стороне сервера не влияет на сортировку документов в коллекциях на стороне клиента.

Например, предположим, что у вас есть запрос find как { num: { $gte: 1 } } и есть 3 документа, которые удовлетворяют этому условию, с numравно 3, 2 а также 1 соответственно. Эти 3 документа будут отправлены в коллекцию клиентов из этой публикации.

Теперь давайте добавим новый документ в эту коллекцию Монго, с num: 2.5, Что произойдет, учитывая, что у вас есть { limit: 3 } как параметры запроса? Издание отправит клиенту: removed событие для документа с num: 1 а также added событие для документа с num: 2.5, А на стороне клиента будут документы в таком порядке: 3, 2, 2.5,

После этого должно быть понятно, что вы должны сортировать свои документы и на стороне клиента. Итак, в моем коде выше это должно быть:

that.tags = Tags.find({}, { sort: { counts: -1 } }).fetch();

Также ознакомьтесь с документацией относительно того, что происходит при изменении аргументов публикации.

Другие вопросы по тегам