C#-随机MongoDB记录
作者:互联网
这个问题已经在这里有了答案: > Random record from MongoDB 27个
简介/措施
我正在使用具有10 GB记录(将近3百万条记录)的MongoDB数据库.
每个记录(文档)都有一个称为DomainClass的字段(这是我们先前定义的11个不同类中的一个).
我要完成的工作
出于统计的原因,我必须从该数据库中提取每种DomainClass类型的100条记录,而我不能简单地获得前100条记录,因为该示例会有偏差.我需要将这100条记录随机分配到数据库中.
我尝试过的
基本上,这就是我尝试过的(在C#中).
1-计算属于某个DomainClass的记录数.
2-在0和计数之间随机分配100个数字
3-查找属于该DomainClass的所有记录
4-将它们作为列表存储在内存中
5-使用所有先前随机化的整数(100)作为此列表的索引(解决随机化需求).
瑕疵
恐怕我无法为单个类的所有记录分配足够的内存(RAM).由于我需要将记录放置在数据库中的随机位置,因此我必须将它们放入内存中才能真正生成完全随机的样本
注意事项
我在文件中没有随机字段.最好的选择是文档的日期字段,如下所示:
"CreationDate" : ISODate("2013-06-25T22:43:15.571Z")
我可以通过查找某个示例在某秒钟内创建的记录来获取伪随机记录,但是由于秒数本身不是字段,因此我找不到任何方法.
在此先感谢您是否需要提供其他信息.
解决方法:
我的方法是:
>获取所有将指向文档(而不是列表中的元素)的随机数
>对每个随机数运行以下查询:
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);
将其循环,我认为它将解决您的问题.
我的观点是使用跳过和限制并直接从数据库获取随机文档.由于您希望它们以随机顺序(不进行排序),因此它们的顺序与列表中的顺序相同.跳过和限制将为您提供与客户端的DomainClassList.ElementAt(index)相同的结果.
标签:random-sample,mongodb,c 来源: https://codeday.me/bug/20191123/2064454.html