Получить случайную запись в базе данных 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
который возвращает всех пользователей, хотя они не упорядочены по идентификатору   -  person Quantm    schedule 16.08.2016
comment
использовать запрос equalTo со случайным идентификатором   -  person EI Captain v2.0    schedule 17.08.2016
comment
попробовал, все равно возвращает null :/   -  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 в качестве ключа и uid в качестве значения. Каждый раз, когда я добавляю нового пользователя, я беру «usersCount» (который я раньше увеличивал на 1) и использую его как ключ.

Таким образом, я могу легко захватить случайного пользователя, используя это:

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