我有一個帶文件的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