我在我的集合中使用时间戳,因此每个文档都有一个时间戳,用户希望从“ts1”(时间戳1)到“ts2”(时间戳2)获取文档,但是在那个间隔中有太多文档所以我不要只返回每个n,例如,如果有100000个文件,我需要显示1000个文件,所以100000/1000 = 100.每100个文件.
这是可能的,我怎么能实现这一点.
PS.我需要在Meteor发布方法中查询这个.
这是我到目前为止所得到的:
Meteor.publish('documents-chunk', function (from, to) {
//get find documents count and get nth
var count = Documents.find({time: {$gte: from, $lte: to}}).count();
if (count > 2000) {
var nth = Math.round(count / 1000);
return Documents.find(/*query every nth*/);
}
return Documents.find({time: {$gte: from, $lte: to}});
});
解:
我用Matt K的答案解决了这个问题.
这就是我所做的:首先我修改了我的收藏并添加了额外的“id”字段:
**
1.
**
Document.find({}, {sort: {time: 1}}).forEach(function (c, i) {
Document.update(c, {$set: {id: i + 1}});
console.log(i + 1);
});
这个集合的记录少于1,5M,所以需要一些时间,(还要注意,我必须在此集合中添加索引{time:1},否则会导致数据库崩溃)
**
2.
**
Meteor.publish('documents-chunk', function (from, to) {
var nth = Math.round(Documents.find({time: {$gte: from, $lte: to}}, {sort: {time: 1}}).count() / 1000);
return Documents.find({time: {$gte: from, $lte: to, $mod: [nth, 0]}}, {sort: {time: 1}});
});
这对我有用,现在我得到了我需要的结果;
我在http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/读到这种方法不推荐.但是在这个时候我找不到任何其他解决方案来解决这个问题,虽然我发现要求它是https://jira.mongodb.org/browse/SERVER-2397所以也许将来会有更清洁的解决方案,但是现在它可行.
最佳答案 你不能,至少不是我的知识.你有三个选择:
发布并订阅全部100,000,然后每1000次显示.从逻辑上讲,您的查询基于查询返回的结果数.无论你怎么看,这都是一个两步的过程.
如果你想变得可爱,你可以让_id(或其他字段)成为自动递增的数字.然后,设置var qCount = cursor.count().然后,查询_id%qCount === 0.
在创建时为每1000条记录添加一个示例字段,然后查询:{$exists:{sample:true}}
重新思考业务逻辑.每1000条记录增加的价值是多少?如果要“注视数据”,你可能应该在数据上使用聚合来消除异常值. (这是正确的选择,但说服客户是另一个故事…)