2017-08-30 96 views
0

这是我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个不同的错误:

  • 排序和限制不起作用:我有时g等3个以上的结果,并没有按'计数'排序

  • 回调无法正常工作。它太快了,我在客户端和服务器上得到了不同的结果。我试过这种方式,onSuccess()Meteor.autorun(),但没有运气。如果我使用一个setTimeout我可以看到正确的游标

标题搜索是似乎工作的唯一的东西。

回答

2

首先,根据documentation.count()会忽略的.skip().limit()的影响,因此,举例来说,如果你有100条记录总,和您的查询选项有{ limit: 3 }然后.count()此光标将返回100而不是3

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

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

最后,服务器端排序影响文档在客户端集合排序。

例如,让我们假设你有发现查询为{ num: { $gte: 1 } }和有3个文件,满足这一条件,与num享有平等321相应。这3份文件将从本出版物发送给客户收集。

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

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

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

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

+0

1-有趣,谢谢澄清。我在服务器上看到了正确的输出,但是如果我发送一个空字符串,客户端显示4个结果(服务器只有3个)。也许与回调问题有关? 2-是的,正如上面评论的那样。我发送“this.tag”这是一个字符串(服务器上的searchString)。我试过你的反正,但我得到这个错误:“错误:参数2必须是一个函数”(但不要担心这个) 3-哇,我从角流星文档复制这个信息:S现在排序在客户端但不起作用。这并不是什么大不了的,因为我可以用AngularJS对其进行排序 –

+0

我不是很明白这一点:“这是一个非常重要的原因,您应该始终获取您订阅的相同数据(不要”取”)。”什么意思与“相同的数据”。是不是总是一样的? 当然,我在客户端的光标大小上遇到的问题与此有关。我会给它一个解决方法 –

+0

我怀疑当你重新订阅不同的参数时,你的客户端集合没有被清除,所以你可以添加过滤到客户端以及排序/限制。这样它应该没有问题。 – Styx