这个问题在这里已有答案:
Introduction/Measures
我正在使用具有10 GB记录的MongoDB数据库(近300万条记录) .
每个记录(文档)都有一个名为 DomainClass
的字段(这是11个不同类中的一个,以前由我们定义) .
What i'm trying to accomplish
出于统计原因,我必须从这个数据库中提取 100 records of each type of DomainClass
,并且我不能简单地获得前100个,因为样本会有偏差 . 我需要在数据库中随机化这100条记录 .
What i have tried:
这基本上就是我所尝试过的(在C#中) .
1 - 计算属于某个 DomainClass
的记录数 .
2 - 在0和计数之间随机化100个数字
3-查找属于该 DomainClass
的所有记录
4-将它们作为列表放入内存中
5 - 使用所有先前随机化的整数(100)作为此列表的索引(以解决随机化需求) .
Flaws
我担心,我将无法为单个类的所有记录分配足够的内存(RAM) . 由于我需要记录在数据库中的随机位置,我必须将它们放在内存中才能真正生成完全随机化的样本
Considerations
我的文件中没有随机字段 . 我最好的选择是文档的 Date
字段,如下所示:
"CreationDate" : ISODate("2013-06-25T22:43:15.571Z")
我可以通过查找在某一秒中创建的记录来获取伪随机记录,但我无法找到任何方法,因为秒本身不是字段 .
在此先感谢,如果我必须提供任何其他信息,请告诉我 .
1 回答
我的方法是:
获取将指向文档的所有随机数(不是列表中的元素)
为每个随机运行以下查询:
Edit
对于每个
DomainClass
:把它放在一个循环中,我认为它将解决你的问题 .
我的观点是使用
skip
和limit
并从数据库直接获取随机文档 . 由于您希望它们以随机顺序排列(不进行排序),因此它们将具有与列表中相同的顺序 . Skip和Limit将在客户端提供与DomainClassList.ElementAt(index)
相同的结果 .