Сортировка и ограничение не работает с Монго + Метеор
Это мое 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();
Также ознакомьтесь с документацией относительно того, что происходит при изменении аргументов публикации.