nosql - MongoDB如何随机获取若干条记录
黄舟
黄舟 2017-04-21 10:56:15
0
2
717

在MySQL中,可以通过下面的语句简单的获取随机的5条记录:

SELECT * FROM `table` ORDER BY RAND() LIMIT 5

但是在MongoDB下,没有找到rand()方法,而且ObjectID也不是MySQL那样整数的,不好随机,不知道大家有什么好办法?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

membalas semua(2)
巴扎黑

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.

左手右手慢动作

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~

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan