随机MongoDB记录

时间:2013-07-16 16:24:39

标签: c# mongodb random-sample

简介/措施

我正在使用一个包含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")

我可以通过查找在某一秒中创建的记录来获取伪随机记录,但我无法找到任何方法,因为秒本身不是字段。

在此先感谢,如果我必须提供任何其他信息,请与我联系。

1 个答案:

答案 0 :(得分:3)

我的方法是:

  1. 获取所有指向文档的随机数(不是列表中的元素)
  2. 为每个随机运行以下查询:

      

    db.collection.find()跳过(随机).limit(1);

  3. 修改

    对于每个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);
    

    把它放在一个循环中,我认为它可以解决你的问题。

    我的意思是使用skiplimit并直接从数据库中获取随机文档。由于您希望它们以随机顺序排列(不进行排序),因此它们将具有与列表中相同的顺序。 Skip和Limit将在客户端提供与DomainClassList.ElementAt(index)相同的结果。