在MySQL中,可以通過下麵的語句簡單的獲取隨機的5條記錄:
SELECT * FROM `table` ORDER BY RAND() LIMIT 5
但是在MongoDB下,沒有找到rand()方法,而且ObjectID也不是MySQL那樣整數的,不好隨機,不知道大家有什麼好辦法?
rand()
ObjectID
人生最曼妙的风景,竟是内心的淡定与从容!
其實有在討論是不是要增加這個特性:https://jira.mongodb.org/browse/SERVE...,目前看來沒有實質進展。
其實MySQL裡也只是建立一個臨時表,為所有的備選行產生一個隨機數,然後針對這個隨機數進行排序以獲得你需要的結果。
在MongoDB裡,你得自行為doc建構這樣的排序屬性,這個屬性的值可以是隨機數,從cookbook裡摘過來的:
db.docs.save( { key : 1, ..., random : Math.random() } )
查找的時候,也算個隨機數出來,然後去排序屬性裡找最接近它的,不過記得給排序屬性加索引:
rand = Math.random() cmp = Math.random() result = db.docs.findOne( { key : 2, random : { $gte : rand } } ) if ( result == null ) { result = db.docs.findOne( { key : 2, random : { $lte : rand } } ) }
因為排序屬性的值不像MySQL裡是動態的,所以如果要真正隨機地取得多個doc,還得循環上面的操作。
我想這個問題的根本還是,是否需要數學意義上的隨機,如果只是要個大概,對於大數據量,不加索引的時候,可以用Map/Reduce提高收斂速度。
所以呢,其實用時間戳也行,任何能找出來上下限值,同時別太多重複值的屬性都可以用來做隨機排序。
加上條件 "$where":function () { if(Math.random()>0.1){return true;}else{return false;}} 配合limit(1) 以10分之一的機率隨機選取集合中一筆記錄 可能比較省事,但是應用比較局限。僅做參考~
其實有在討論是不是要增加這個特性:https://jira.mongodb.org/browse/SERVE...,目前看來沒有實質進展。
其實MySQL裡也只是建立一個臨時表,為所有的備選行產生一個隨機數,然後針對這個隨機數進行排序以獲得你需要的結果。
在MongoDB裡,你得自行為doc建構這樣的排序屬性,這個屬性的值可以是隨機數,從cookbook裡摘過來的:
查找的時候,也算個隨機數出來,然後去排序屬性裡找最接近它的,不過記得給排序屬性加索引:
因為排序屬性的值不像MySQL裡是動態的,所以如果要真正隨機地取得多個doc,還得循環上面的操作。
我想這個問題的根本還是,是否需要數學意義上的隨機,如果只是要個大概,對於大數據量,不加索引的時候,可以用Map/Reduce提高收斂速度。
所以呢,其實用時間戳也行,任何能找出來上下限值,同時別太多重複值的屬性都可以用來做隨機排序。
加上條件
"$where":function () { if(Math.random()>0.1){return true;}else{return false;}}
配合limit(1)
以10分之一的機率隨機選取集合中一筆記錄
可能比較省事,但是應用比較局限。僅做參考~