Rumah > Soal Jawab > teks badan
在MySQL中,可以通过下面的语句简单的获取随机的5条记录:
SELECT * FROM `table` ORDER BY RAND() LIMIT 5
但是在MongoDB下,没有找到rand()
方法,而且ObjectID
也不是MySQL那样整数的,不好随机,不知道大家有什么好办法?
巴扎黑2017-04-21 10:58:15
Sebenarnya terdapat perbincangan sama ada untuk menambah ciri ini: https://jira.mongodb.org/browse/SERVE..., tetapi nampaknya tiada kemajuan yang ketara pada masa ini.
Malah, MySQL hanya mencipta jadual sementara, menjana nombor rawak untuk semua baris calon, dan kemudian mengisih nombor rawak untuk mendapatkan hasil yang anda perlukan.
Dalam MongoDB, anda perlu membina sendiri atribut pengisihan untuk dokumen Nilai atribut ini boleh menjadi nombor rawak, diambil daripada buku masakan:
db.docs.save( { key : 1, ..., random : Math.random() } )
Apabila mencari, hitung nombor rawak, dan kemudian pergi ke atribut pengisihan untuk mencari yang paling hampir dengannya, tetapi ingat untuk menambah indeks pada atribut pengisihan:
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 } } ) }
Oleh kerana nilai atribut pengisihan tidak dinamik seperti dalam MySQL, jika anda ingin mendapatkan berbilang dokumen secara rawak, anda perlu menggelungkan operasi di atas.
Saya rasa punca masalah ini ialah sama ada kerawak dalam pengertian matematik diperlukan Jika anda hanya mahukan idea kasar, untuk jumlah data yang besar tanpa pengindeksan, anda boleh menggunakan Map/Reduce untuk meningkatkan kelajuan penumpuan.
Jadi, sebenarnya, cap masa juga boleh digunakan Sebarang atribut yang boleh mencari nilai had atas dan bawah tanpa terlalu banyak nilai berulang boleh digunakan untuk pengisihan rawak.
ringa_lee2017-04-21 10:58:15
Tambah syarat
"$where":function () { if(Math.random()>0.1){return true;} else{return false;}}
Bekerjasama dengan had(1)
Pilih rekod secara rawak daripada set dengan kebarangkalian 1/10
Ia mungkin lebih mudah, tetapi aplikasinya lebih terhad. Untuk rujukan sahaja~