2011-06-12 65 views
9

我有一个MongoDB集合~4M元素。从大的MongoDB集合中选择每个第N个元素w/PHP?

我想抓住那些元素,通过整个集合间隔均匀的X号。

例如,您可以通过收集1000个元素 - 一个每4000行。

现在,我得到了整个集合中的光标,然后只写每一个第N个元素。这给了我需要的东西,但巨大收藏的原始负载需要很长时间。

有没有简单的方法来做到这一点?现在我的猜测方法是对递增的索引属性进行JS查询,并使用模数。一个PHP实现这一点:

db.collection.find({i:{$mod:[10000,0]}})

但这似乎可能将需要同样多的时间查询运行。

+0

做你找到任何解决办法? – 2014-11-27 14:00:23

回答

0

我认为主要的问题,是集可以在服务器上分布,因此你必须遍历整个集合。

+0

在这种情况下,我正在本地服务器上运行整个事情。 – blprnt 2011-06-14 17:16:09

0

不要将整个数据集放在游标中。由于行顺序并不重要,只是收集X随机行了你的总的,返回的结果,然后修改这些记录

+0

问题是我需要从我的集合中均匀分布元素 - 即每第1000个元素。 – blprnt 2011-06-14 20:40:34

+0

创建一个计数字段,然后使用Map来过滤每个第n个元素,然后使用Reduce在该记录上进行操作 – 2011-06-14 20:46:06

+0

谢谢......请尝试一下。我已经有了一个计数字段。只需要尝试使地图的正面/反面减少文档。 – blprnt 2011-06-14 21:05:58

0

我个人在“模数”值设计,用的东西,是一个函数来填充它数据的代表 - 所以如果您的数据每隔一段时间插入一次,您可以做一个模数的时间,如果没有什么可预测的话,那么您可以使用随机值;与这个大小的集合,它会趋向于平均分配很快。

使用随机值的例子...

// 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 }}); 
-4

如果只有你的数据是在一个SQL数据库,因为它应该是......这个问题不会在PHP和答案将如此方便快捷......

加载到任何一个光标,而不是直接在数据库中计算的信息绝对是一个坏主意,是不是可以直接在MongoDB中做到这一点啄?

+0

这个答案是如此落后 – jtromans 2014-02-06 16:20:40

+0

当只处理4M元素和做非MongoDB本地操作时,你应该使用PostgreSQL。 – 2014-03-01 18:41:01

+0

为什么?为什么PostgreSQL会在这里变得更好?我是SQL数据库的重要用户,但对于大多数数据库来说,这种查询是不好的。另外,“MongoDB thingy”?看起来你并没有真正知道你在MongoDB中谈论的权威性。甚至不确定你的答案的第二部分是什么意思。 – Sammaye 2014-06-18 08:05:35

0

这对于Map Reduce Job来说不是一个完美的用例吗?

+0

道歉厚厚,但一些元代码/实际代码指示如何做到这一点将不胜感激。谢谢。 – 2014-08-17 14:59:08

+2

-1没有回答这个问题,这应该是一个评论 – y3sh 2014-11-14 21:52:19

0

一个简单的(低效的)方法就是使用流。

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 
    } 
});