排序和限制不适用于 Mongo + Meteor

Sort and limit not working with Mongo + Meteor

这是我的 publish.js 文件,我在其中发布了我的 collection:

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

    return tags;

这是我订阅这个的组件 collection:

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

因此我得到了 2 个不同的错误:

标题搜索是唯一有效的方法。

首先,根据documentation.count()将忽略.skip().limit()的影响,因此,例如,如果您总共有100条记录,并且您的查询选项有 { limit: 3 } 然后 .count() 对于此游标将 return 100 而不是 3.

其次,查看您的代码,我假设您的出版物至少需要一个参数:searchString。但是您订阅它的代码不会通过它。我觉得应该是这样的:

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

最后,服务器端排序不会影响客户端集合中的文档排序。

例如,假设您的查找查询为 { num: { $gte: 1 } },并且有 3 个文档满足此条件,其中 nums 等于 321 相应地。这 3 个文件将从本出版物发送到客户集合。

现在,让我们向这个 mongo 集合中添加新文档,num: 2.5。考虑到您有 { limit: 3 } 作为查询选项,会发生什么?该出版物将向客户发送:removed 文档 num: 1 事件和 added 文档 num: 2.5 事件。客户端集合将按以下顺序包含文档:3, 2, 2.5.

在此之后,您 也应该 在客户端对文档进行排序应该是可以理解的。所以,在我上面的代码中它应该是:

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

另外,看看 documentation regarding what happens when publication arguments are changed