3

介绍/措施

我正在使用具有 10 GB 记录(近 300 万条记录)的 MongoDB 数据库。

每条记录(文档)都有一个名为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")

例如,我可以通过查找在特定秒内创建的记录来获得伪随机记录,但我找不到任何方法来做到这一点,因为秒数本身不是一个字段。

提前谢谢,如果我必须提供任何其他信息,请告诉我。

4

1 回答 1

3

我的方法是:

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

    db.collection.find().skip(random).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);

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

我的观点是使用skiplimit直接从数据库中获取随机文档。由于您希望它们以随机顺序排列(不进行排序),因此它们的顺序与您的列表中的顺序相同。DomainClassList.ElementAt(index)跳过和限制将为您提供与客户端相同的结果。

于 2013-07-16T16:48:26.937 回答