Kueri baris acak di ndb [ditutup]

Saya mencoba mengembangkan aplikasi web di mesin aplikasi Google menggunakan webapp2.

Salah satu hal yang perlu saya lakukan adalah mengambil secara acak dari ndb dan menampilkannya. Apakah ada metode efektif yang memungkinkan saya melakukannya?


person Jun Hao    schedule 25.06.2013    source sumber
comment
kemungkinan duplikat Mengambil catatan acak dari Google App Engine Penyimpanan data?   -  person Sebastian Kreft    schedule 25.06.2013


Jawaban (3)


Saya berasumsi yang Anda maksud adalah catatan acak ketika Anda mengatakan "acak dari ndb".

Jika Anda menggunakan id otomatis, Anda dapat menggunakan pendekatan berikut. (seberapa jarang id Anda akan mempengaruhi seberapa sukses hal ini).

gunakan random.randrange(start, stop) dengan start menjadi 0, stop menjadi (2^52)-1 , mengingat kebijakan alokasi id yang baru.

lakukan kueri hanya kunci untuk kunci yang lebih besar dari kunci yang dibuat dari id acak. jika tidak ada hasil coba buat kunci ‹ kunci dibuat.

ambil 10 (atau sejumlah) kunci

lakukan pilihan acak random.choice(seq) pada urutan kunci yang dikembalikan dari pengambilan sebelumnya.

key.get() catatan yang dipilih.

Alternatif untuk sejumlah kecil entitas katakanlah ‹ 1000

lakukan kueri hanya kunci dan periksa semua kunci, lalu lakukan random.choice() pada daftar kunci dan a db.get() pada kunci yang dipilih. Ini akan jauh lebih cepat daripada solusi perulangan apa pun. Jika Anda sering melakukan ini dan kumpulan entitas yang dipilih tidak sering berubah dan daftar kunci berukuran kurang dari 1 MB, Anda dapat menyimpan kunci dalam cache di memcache.

person Tim Hoffman    schedule 25.06.2013
comment
hai, mengikuti saran jawaban ini, saya menerapkan versi yang sangat disederhanakan karena mengambil dengan randrange dan menanyakan kunci ‹ atau › tidak berfungsi untuk saya (baik nilai kosong atau sama). berikut cuplikannya: 1. ambil semua kunci keys = Model.query().fetch(keys_only=True) 2. ambil kunci acak key = random.sample(keys, 1)[0] 3. ambil entitas: return key.get(). tentu saja hal ini dapat dengan mudah diperluas untuk mendukung berbagai entitas. - person gru; 30.01.2014
comment
Seberapa baik pendekatan tertentu akan sangat bergantung pada jumlah dan ketersebaran id yang dialokasikan. Fakta bahwa Anda dapat mengambil semua kunci dalam satu kueri termasuk dalam sejumlah kecil kualifikasi entitas saya. Pendekatan lainnya adalah untuk jutaan kunci atau lebih. - person Tim Hoffman; 30.01.2014

Ada properti khusus sebar. Saya tidak tahu banyak tentangnya, tapi disebutkan dalam implementasi peta/pengurangan.

person Guido van Rossum    schedule 25.06.2013
comment
Saya tidak terlalu yakin apa itu properti yang dilindungi undang-undang - person Jun Hao; 27.06.2013
comment
Sudahkah Anda mencoba Googling untuk itu? - person Guido van Rossum; 04.07.2013
comment
Hanya mungkin untuk mendapatkan catatan dari ndb yang diurutkan berdasarkan properti __scatter__. ndb tidak mengizinkan pengambilan properti AFAIK yang sebenarnya. Jadi hasilnya akan selalu sama. Tidak ada keacakan di dalamnya. - person yaswanth; 27.08.2019

Jika jumlah entitas di penyimpanan data Anda tidak terlalu banyak, Anda dapat menggunakan pendekatan di bawah ini: 1, Gunakan yourquery = entitykind.query() untuk mengambil semua entitas

2, Gunakan yourquery.count() untuk mendapatkan jumlah entitas

3, Gunakan generator nomor acak untuk membuat nomor acak dalam nilai hitungan di atas

4, Gunakan perulangan for untuk mengulangi entitas yang dikembalikan

permintaan Anda.fetch()

dan kemudian ketika berapa kali loop dieksekusi sama dengan angka acak di atas, gunakan entitas tertentu di aplikasi web Anda

person tony m    schedule 25.06.2013
comment
Ini berfungsi dengan baik untuk kumpulan data kecil. Jika Anda memiliki entitas dalam jumlah besar, ini tidak akan berskala. - person Tim Hoffman; 25.06.2013
comment
Bahkan untuk himpunan kecil pun ada cara yang lebih baik, menggunakan offset=‹random›, limit=1. - person Guido van Rossum; 25.06.2013