mongodb – Meteor,Mongo查询查找每个第n个文件

我在我的集​​合中使用时间戳,因此每个文档都有一个时间戳,用户希望从“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条记录增加的价值是多少?如果要“注视数据”,你可能应该在数据上使用聚合来消除异常值. (这是正确的选择,但说服客户是另一个故事…)

点赞