首页 文章

随机MongoDB记录[重复]

提问于
浏览
3

这个问题在这里已有答案:

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 回答

  • 3

    我的方法是:

    • 获取将指向文档的所有随机数(不是列表中的元素)

    • 为每个随机运行以下查询:

    db.collection.find() . skip(random).limit(1);

    Edit

    对于每个 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) 相同的结果 .

相关问题