从带有PHP的大型MongoDB集合中选择第N个元素?

问题描述

| 我有一个〜4M元素的MongoDB集合。 我想获取X个元素,在整个集合中均匀分布。 例如,从集合中获取1000个元素-每4000行一个。 现在,我将整个集合放到一个游标中,然后只写每个第N个元素。这满足了我的需求,但是庞大的收藏集需要很长的时间。 是否有捷径可寻?现在,我猜测的方法是对具有模数的递增索引属性执行JS查询。这个的PHP实现:
db.collection.find({i:{$mod:[10000,0]}})
但这似乎可能需要花费相同的时间来运行查询。 杰尔     

解决方法

        我认为主要的问题是,集合可以分布在服务器上,因此您必须遍历整个集合。     ,        不要将整个数据集放在游标中。由于行顺序并不重要,因此只收集总数中的x个随机行,将其返回作为结果,然后修改这些记录     ,        我个人会设计一个“模数”值,并用代表数据的函数填充它-因此,如果整天以固定间隔插入数据,则可以计算时间模数,无法预测,则可以使用随机值;有了这样大小的集合,它将趋向于很快地平均分配。 使用随机值的示例...
    // add the index
    db.example.ensureIndex({modulus: 1});
    // insert a load of data
    db.example.insert({ your: \'data\',modulus: Math.round((Math.random() * 1000) % 1000) });
    // Get a 1/1000 of the set
    db.example.find({modulus: 1});
    // Get 1/3 of the set
    db.example.find({modulus: { $gt: 0,$lt: 333 }});
    ,        一种简单(效率低下)的方法是使用流。
var stream = collection.find({}).stream();
var counter = 0;

stream.on(\"data\",function (document) {
  counter++;

  if (counter % 10000 == 0) {
    console.log(JSON.stringify(document,null,2));
    //do something every 10,000th time
  }
});
    ,        如果只有您的数据应该在sql数据库中,那么... ...这个问题就不会出现在PHP中,答案将变得如此简单和快捷... 将任何内容加载到游标中而不是直接在db中计算信息绝对不是一个好主意,难道不可能直接在MongoDB中做到这一点吗?