排序和限制不适用于 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 个不同的错误:
排序和限制不起作用:我有时会得到超过 3 个结果,但没有按 'counts'
排序
回调无法正常工作。它太快了,我在客户端和服务器上得到了不同的结果。我尝试过这种方式,onSuccess()
和 Meteor.autorun()
但没有运气。如果我使用 setTimeout
我可以看到正确的光标
标题搜索是唯一有效的方法。
首先,根据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 个文档满足此条件,其中 num
s 等于 3
、2
和 1
相应地。这 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。
这是我的 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 个不同的错误:
排序和限制不起作用:我有时会得到超过 3 个结果,但没有按 'counts'
排序
回调无法正常工作。它太快了,我在客户端和服务器上得到了不同的结果。我尝试过这种方式,
onSuccess()
和Meteor.autorun()
但没有运气。如果我使用setTimeout
我可以看到正确的光标
标题搜索是唯一有效的方法。
首先,根据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 个文档满足此条件,其中 num
s 等于 3
、2
和 1
相应地。这 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。