รับรายการฐานข้อมูล firebase แบบสุ่ม

ฉันมีผู้ใช้เช่นนี้อยู่ในฐานข้อมูลของฉัน:

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

ฉันต้องการรับผู้ใช้แบบสุ่ม แต่ฉันไม่รู้ว่าต้องทำอย่างไร ฉันพยายามแล้ว แบบนี้:

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))

ฉันได้รับ usersCount จากฐานข้อมูล ที่นั่น ฉันจะเพิ่มตัวเลขทุกครั้งที่เพิ่มผู้ใช้

แต่นี่ไม่ได้ผล นี่คือสิ่งที่ฉันได้รับหากฉันพิมพ์สิ่งนี้:

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

ข้อเสนอแนะใด ๆ ฉันจะบรรลุเป้าหมายนี้ได้อย่างไร


person Quantm    schedule 16.08.2016    source แหล่งที่มา
comment
ใช้มันเหมือน DataService.sharedInstance.DB_REF_USERS.queryStarting(atValue: rand).queryLimited(toFirst: 1))   -  person EI Captain v2.0    schedule 16.08.2016
comment
อืม นั่นก็พิมพ์อะไรแปลกๆ เหมือนกันนะ   -  person Quantm    schedule 16.08.2016
comment
วิ่งไปสองสามครั้งและมันก็พิมพ์เหมือนเดิมเสมอ (/users { l = 1; sp = 1; vf = l; })   -  person Quantm    schedule 16.08.2016
comment
อืม มันกลับมาแค่ 1 เท่านั้น   -  person Quantm    schedule 16.08.2016
comment
ดังนั้นมันจะให้ค่าเดิมเสมอถ้ามันส่งกลับค่าเดียวกัน... :)   -  person EI Captain v2.0    schedule 16.08.2016
comment
โอเค ฉันจะตรวจสอบสิ่งนั้น :D แต่สมมติว่าฉันแก้ไขมันแล้ว มันยังคงให้อาร์เรย์ไร้สาระนี้แก่ฉันจากด้านบนและไม่ใช่ผู้ใช้หรืออะไรสักอย่าง หรือฉันต้องทำอะไรกับมัน?   -  person Quantm    schedule 16.08.2016
comment
คุณต้องใส่ผู้สังเกตการณ์ลงในแบบสอบถามนั้นหลังจากนั้นมันจะให้ค่าจากฐานข้อมูล   -  person EI Captain v2.0    schedule 16.08.2016
comment
โอเค ขอบคุณ ฉันจะลองดู   -  person Quantm    schedule 16.08.2016
comment
โอเค ฉันพยายามเพิ่มผู้สังเกตการณ์แต่กลับให้ภาพรวมที่ว่างเปล่า   -  person Quantm    schedule 16.08.2016
comment
ยังคงอยู่ Optional(<null>)   -  person Quantm    schedule 16.08.2016
comment
สร้างคำถามง่ายๆ ก่อน 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
ที่ส่งคืนผู้ใช้ทั้งหมดแม้ว่าจะไม่ได้เรียงลำดับตาม id ก็ตาม   -  person Quantm    schedule 16.08.2016
comment
ใช้เท่ากับการค้นหาด้วยรหัสสุ่ม   -  person EI Captain v2.0    schedule 17.08.2016
comment
ลองแล้วยังคงส่งคืนค่าว่าง :/   -  person Quantm    schedule 17.08.2016
comment
ฉันพบวิธีแก้ปัญหา ฉันจะโพสต์คำตอบภายในไม่กี่นาที   -  person Quantm    schedule 17.08.2016


คำตอบ (1)


ดังนั้น เนื่องจาก firebase ทำงานค่อนข้างแตกต่างจากฐานข้อมูลเชิงสัมพันธ์ ความซ้ำซ้อนจึงดูเหมือนจะยอมรับได้เพื่อให้ทำงานได้รวดเร็วและมีประสิทธิภาพ ดังนั้นฉันจึงคิดวิธีแก้ปัญหาที่เหมาะกับฉันขึ้นมา

เมื่อฉันสร้างผู้ใช้ ฉันจะเพิ่มเขาลงในแผนผัง "ผู้ใช้" นอกจากนี้ ฉันเพิ่มเขาลงในแผนผัง "numUsers" (ฉันเลือกชื่อได้แย่มาก ขออภัยด้วย) ดูเหมือนว่า:

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

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

ดังนั้น "numUsers" จึงประกอบด้วย id as key และ uid as value ทุกครั้งที่ฉันเพิ่มผู้ใช้ใหม่ ฉันจะคว้า "usersCount" (ซึ่งฉันเพิ่มทีละ 1 ก่อนหน้านี้) และใช้เป็นคีย์

ด้วยวิธีนี้ ฉันสามารถดึงดูดผู้ใช้แบบสุ่มได้อย่างง่ายดายโดยใช้สิ่งนี้:

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