Meteor,Mongo查询查找每个第n个文档

时间:2015-03-09 18:40:39

标签: mongodb meteor

我在我的收藏中使用时间戳,因此每个文档都有一个时间戳,用户希望从“ ts1 ”(时间戳1)到“ ts2 ”获取文档(时间戳2),但是在那段时间里有太多的文件,所以我不想每隔一天返回一次,例如,如果有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}});
});

SOLUTION:

我用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所以将来可能会有更清洁的解决方案,但是现在它可以工作。

2 个答案:

答案 0 :(得分:1)

你不能,至少我不知道。您有三种选择:

发布并订阅全部100,000,然后每1000次显示。从逻辑上讲,您的查询基于查询返回的结果数。无论你怎么看,这都是一个两步的过程。

如果你想变得可爱,你可以让_id(或其他字段)成为自动递增的数字。然后,设置var qCount = cursor.count()。然后,查询_id % qCount === 0

在创建后的每第1000条记录中添加sample字段,然后查询:{$exists: {sample: true}}

重新思考业务逻辑。每1000条记录的附加值是多少?如果要注意数据"你可能应该在数据上使用聚合来消除异常值。 (这是正确的选择,但说服客户是另一个故事......)

答案 1 :(得分:1)

如果您认为mongoDB _id值是真正随机分配的,那么您只需按_id排序并选择集合中的前N个。这将从间隔中给出N个随机值。

Meteor.publish('documents-chunk', function (from, to) {
  return Documents.find({time: {$gte: from, $lte: to}},{sort: {_id: 1}, {limit: 1000}});
});

我建议你运行一些关于你得到的随机性的统计数据。