简介/措施
我正在使用一个包含10 GB记录的MongoDB数据库(近300万条记录)。
每个记录(文档)都有一个名为DomainClass
的字段(这是11个不同类别中的一个,以前由我们定义)。
我想要完成的事情
出于统计原因,我必须从这个数据库100 records of each type of DomainClass
中提取,我不能简单地得到前100个,因为样本会有偏差。我需要在数据库中随机化这100条记录。
我尝试了什么:
这基本上就是我尝试过的(在C#中)。
1 - 计算属于某个DomainClass
的记录数。
2 - 在0和计数之间随机化100个数字
3-查找属于DomainClass
4-将它们作为列表放入内存
5 - 使用所有先前随机化的整数(100)作为此列表的索引(以解决随机化需求)。
缺陷
我担心,我将无法为单个类的所有记录分配足够的内存(RAM)。由于我需要记录在数据库中的随机位置,我必须将它们放在内存中才能真正生成完全随机化的样本
考虑
我的文件中没有随机字段。我最好的选择是文档的Date
字段,如下所示:
"CreationDate" : ISODate("2013-06-25T22:43:15.571Z")
我可以通过查找在某一秒中创建的记录来获取伪随机记录,但我无法找到任何方法,因为秒本身不是字段。
在此先感谢,如果我必须提供任何其他信息,请与我联系。
答案 0 :(得分:3)
我的方法是:
为每个随机运行以下查询:
db.collection.find()跳过(随机).limit(1);
修改强>
对于每个DomainClass
:
var count = db.collection.find({DomainClass: "aClass"}).count();
var random = Math.floor(Math.random() * count);
var randomDoc = db.collection.find({DomainClass: "aClass"}).skip(random).limit(1);
把它放在一个循环中,我认为它可以解决你的问题。
我的意思是使用skip
和limit
并直接从数据库中获取随机文档。由于您希望它们以随机顺序排列(不进行排序),因此它们将具有与列表中相同的顺序。 Skip和Limit将在客户端提供与DomainClassList.ElementAt(index)
相同的结果。