数据库
首页 > 数据库> > C#-随机MongoDB记录

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