Dapatkan entri database firebase acak

Saya memiliki pengguna seperti ini di dalam database saya:

users
--45jklj4kljfejlk34 // random uid
----id: 1 // I add this manually when creating a user (maybe it helps getting a random user)
----someData: true
--454jkljkljefnd4lk
----id: 2
----someData: true

Saya ingin mendapatkan pengguna acak, tetapi saya tidak tahu caranya. Saya mencoba sth. seperti ini:

let usersCount = DataService.sharedInstance.DB_USER_COUNT
let rand = Double(arc4random_uniform(UInt32(usersCount))) + 1
let userRef = DataService.sharedInstance.DB_REF_USERS.queryOrdered(byChild: "id").queryStarting(atValue: rand).queryLimited(toFirst: 1))

Saya mendapatkan UsersCount dari database. Di sana, saya menambah angkanya setiap kali saya menambahkan pengguna.

Tapi ini tidak berhasil. Inilah yang saya dapatkan jika saya mencetak ini:

(/users {
    i = id;
    l = 1;
    sp = 1;
    vf = l;
})

Ada saran, bagaimana saya bisa mencapai ini?


person Quantm    schedule 16.08.2016    source sumber
comment
gunakan seperti DataService.sharedInstance.DB_REF_USERS.queryStarting(atValue: rand).queryLimited(toFirst: 1))   -  person EI Captain v2.0    schedule 16.08.2016
comment
Hm, itu mencetak hal aneh yang sama   -  person Quantm    schedule 16.08.2016
comment
menjalankannya beberapa kali dan hasilnya selalu sama (/users { l = 1; sp = 1; vf = l; })   -  person Quantm    schedule 16.08.2016
comment
hm, itu hanya mengembalikan 1   -  person Quantm    schedule 16.08.2016
comment
jadi itu selalu memberi Anda nilai yang sama jika mengembalikan nilai yang sama... :)   -  person EI Captain v2.0    schedule 16.08.2016
comment
Oke, saya akan memeriksanya :D Tapi katakanlah saya sudah memperbaikinya. Itu masih memberi saya array yang tidak masuk akal dari atas dan bukan pengguna atau semacamnya. Atau apakah saya harus melakukan sesuatu dengannya?   -  person Quantm    schedule 16.08.2016
comment
Anda harus menempatkan pengamat pada kueri itu setelah itu akan memberi Anda nilai dari database   -  person EI Captain v2.0    schedule 16.08.2016
comment
oke, terima kasih, saya akan mencobanya   -  person Quantm    schedule 16.08.2016
comment
Oke, saya mencoba menambahkan pengamat tetapi hasilnya memberi saya gambaran kosong   -  person Quantm    schedule 16.08.2016
comment
masih Optional(<null>)   -  person Quantm    schedule 16.08.2016
comment
buat pertanyaan sederhana terlebih dahulu DataService.sharedI‌​nstance.DB_REF_USERS.‌​queryOrdered(byChild: "id").observeSingleEven‌​t(of: .value, with: {(snapshot) in print(snapshot) })   -  person EI Captain v2.0    schedule 16.08.2016
comment
yang mengembalikan semua pengguna, meskipun mereka tidak diurutkan berdasarkan id   -  person Quantm    schedule 16.08.2016
comment
gunakan kueri equalTo dengan id acak   -  person EI Captain v2.0    schedule 17.08.2016
comment
mencobanya, masih mengembalikan null :/   -  person Quantm    schedule 17.08.2016
comment
Saya menemukan solusi. Saya akan memposting jawabannya dalam beberapa menit   -  person Quantm    schedule 17.08.2016


Jawaban (1)


Jadi, karena cara kerja firebase sangat berbeda dengan database berbasis relasional, redundansi tampaknya dapat diterima agar bisa cepat dan efisien. Jadi saya menemukan solusi yang berhasil untuk saya.

Saat saya membuat pengguna, saya menambahkannya ke pohon "pengguna". Selain itu, saya menambahkan dia ke pohon "numUsers" (saya buruk dalam memilih nama, maaf untuk itu). Ini terlihat seperti itu:

users
--45jklj4kljfejlk34 // random uid
----id: 1
----someData: true
--454jkljkljefnd4lk
----id: 2
----someData: true

numUsers
--1: 45jklj4kljfejlk34
--2: 454jkljkljefnd4lk

Jadi, "numUsers" terdiri dari id sebagai kunci dan uid sebagai nilai. Setiap kali saya menambahkan pengguna baru, saya mengambil "usersCount" (yang sebelumnya saya tambah 1) dan menggunakannya sebagai kunci.

Dengan cara ini, saya dapat dengan mudah mengambil pengguna acak dengan menggunakan ini:

DataService.sharedInstance.DB_REF_USERS.child("\(rand)").observeSingleEvent(of: .value, with: {(snapshot) in print(snapshot) })
person Quantm    schedule 17.08.2016