我有一个带文件的mongo集合。每个文档中有一个字段是0或1.我需要从数据库中随机抽取1000条记录,并将该字段的文档数量设为1.我需要进行1000次抽样。我该怎么做 ?Mongo随机采样
回答
这里是在mongo
壳为例..假设collname
集合,并在thefield
一个感兴趣的值:
var total = db.collname.count();
var count = 0;
var numSamples = 1000;
for (i = 0; i < numSamples; i++) {
var random = Math.floor(Math.random()*total);
var doc = db.collname.find().skip(random).limit(1).next();
if (doc.thefield) {
count += (doc.thefield == 1);
}
}
这也回答了另一个问题:与SQL不同,MongoDB没有真正的内置函数。此外,跳过可能(...可能)变得更大的随机值麻烦,但取决于。 – Sammaye
我要编辑我的@Stennies评论回答这个但你也可以如果您要跳过大量的记录(在这里说得很大),请使用分隔符自动递增ID索引作为替代。
我写了另一个回答另一个问题,很多像这样的地方有一个人正在试图找到集合的第n个记录:
php mongodb find nth entry in collection
我的答案的后半部分基本上描述了一个潜在的方法,通过你可以解决这个问题。你仍然需要循环1000次才能得到随机的排。
对于MongoDB 3.0和之前的版本,我使用SQL天的旧技巧(我认为维基百科用于他们的随机页面功能)。我在每个需要随机化的对象中存储一个0到1之间的随机数,我们称之为“r”。然后在“r”上添加一个索引。
db.coll.ensureIndex(r: 1);
我们得到随机X对象,你可以使用:
var startVal = Math.random();
db.coll.find({r: {$gt: startVal}}).sort({r: 1}).limit(x);
这让你在一个单一的查找查询随机对象。根据您的需要,这可能是矫枉过正的,但是如果您将要随着时间的推移进行大量抽样,这是一种非常有效的方式,不会在后端加载负载。
太棒了!很聪明! –
优雅的解决方案! –
如果您使用的是mongoengine,则可以使用SequenceField生成增量计数器。
class User(db.DynamicDocument):
counter = db.SequenceField(collection_name="user.counters")
然后获取说100的随机列表,请执行下列操作
def get_random_users(number_requested):
users_to_fetch = random.sample(range(1, User.objects.count() + 1), min(number_requested, User.objects.count()))
return User.objects(counter__in=users_to_fetch)
,你会打电话
get_random_users(100)
对于人来回答,你现在应该使用新的$sample
聚合功能,3.2中新增。
https://docs.mongodb.org/manual/reference/operator/aggregation/sample/
db.collection_of_things.aggregate(
[ { $sample: { size: 15 } } ]
)
然后添加另一个步骤使用$group
得到计数计数了0
S和1
秒。 Here is an example from the MongoDB docs。
- 1. 不使用随机采样()?
- 2. 从CSV采样随机行
- 3. 构建为随机采样
- 4. MATLAB - 采样随机值
- 5. 如何以随机顺序运行采样器/采样器组
- 6. R中的多个随机采样
- 7. 随机采样与熊猫数据帧
- 8. python中的随机通用采样GA
- 9. 从反伽玛分布随机生成随机采样C++
- 10. 如何使用OpenCV在随机森林中停止随机采样?
- 11. 采摘随机在python
- 12. 随机抽样
- 13. 随机抽样
- 14. 随机抽样
- 15. 随机子采样线在一个文件
- 16. 复制分层随机采样无需替换R
- 17. 从包含NAs的data.frame的每一列随机采样
- 18. 采样和更换载体的随机元素,有条件
- 19. 像素网格中非相邻单元的随机采样
- 20. Android加速度计采样率随机峰值
- 21. 采样随机浮点数在numpy范围内
- 22. 分配采样多项式值均匀地随机
- 23. 随机采样的3d矢量场的Matlab散度
- 24. 如何在numpy中随机采样二维矩阵
- 25. 从Python中的列表中随机采样函数的语法
- 26. 熊猫:使用列值的随机采样替换NaN
- 27. 如何在java中实现一组向量的随机采样?
- 28. 没有任何重叠的随机重新采样
- 29. 二维numpy数组的加权随机采样
- 30. 在http采样器上指定随机超时
您能否接受答案? –
[MongoDB的随机记录]可能的重复(http://stackoverflow.com/questions/2824157/random-record-from-mongodb) –
嘿Aditya,你能接受一个答案吗? – dalanmiller