2016-10-26 5 views
0

Если у меня есть какие-то данные в Firebase базы данных в режиме реального времени, как этотFirebase: запрос и удалять ключи в диапазоне

root--. 
     |--stuff--. 
       |--1 
       |--2 
       |--3 
       |--4 
       |--5 
       |--6 
       |--7 

, где все эти числа являются ключами, которые содержат больше данных, и я хочу, чтобы удалить все ключи меньше или равны 4, как мне это сделать, не загружая всю ветку «штуки»?

С быстрым Я думаю, что я могу запросить ключи в этом диапазоне от

let ref = FIRDatabase.database().reference().child("stuff") 
let query = ref.queryEnding(atValue: 4) 

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

for key in queryResults { 
    let ref = FIRDatabase.database().reference().child("stuff/\(key)") 
    ref.setValue(nil) 
} 

(на самом деле я имею дело с ключами временной метки, и я хочу, чтобы удалить ветви данных, которые получили слишком стар.)

+0

Смотрите мой ответ здесь: http://stackoverflow.com/questions/38835857/query-ref-removevalue-removes -the-whole-child-in-just-a-node –

+0

Звучит так, будто вы на правильном пути. Запросите первые 4 узла, а затем удалите их с помощью их ключей - см. Мой ответ фрагмента кода. Есть что-то еще? – Jay

+0

Как я могу запросить эти первые 4 узла? Я не думаю, что ref.queryEnding (atValue: 4) достаточно. – user3915477

ответ

0

Не знаете, как это сделать в быстры, но вы можете сделать это с заказом ByKey.

.database().reference() 
    .child("stuff") 
    .orderByKey() 
    .startAt(STARTING_TIMESTAMP) 
    .endAt(ENDING_TIMESTAMP) 

И затем переверните через ids соответствующего результата.

Это будет загружать всю информацию для этих детей. Если вы не хотите, чтобы вам было нужно сохранить его в другом месте, чтобы легко удалить его.

+0

Имея отдельную ветку, чтобы ничего не хранить, кроме временных меток для сбора мусора, на самом деле кажется довольно хорошей идеей, спасибо. – user3915477

0

Образец Swift код 3/Firebase 2.x, чтобы получить ключи от снимка

for child in (snapshot?.children)! {   
    let snap = child as! FDataSnapshot 
    print(snap.key)     
} 
+0

Я думаю, что будет загружать не только ключи, но и их детей, что не является оптимальным. – user3915477

+0

@ user3915477 Это правильно. В вашем вопросе говорится, что вы хотели избежать загрузки всей ветки и не знали, как получить ключи. По моему комментарию вы только загрузите 4, которые хотите удалить, а затем повторите их с помощью кода в моем ответе. Я могу расширить этот код, если вам нужно также посмотреть, как выполнять фактический запрос. В качестве побочного примечания нет способа загрузить только ключи - путь вокруг состоит в том, чтобы просто сохранить дублирующий узел с помощью только ключей в нем. Получите те, которые вы хотите удалить, и затем удалите их в обоих узлах. – Jay

+0

Я собираюсь попытаться реализовать эту отдельную ветвь ключей для решения обработки истечения срока действия. Это похоже на приемлемое обходное решение. Благодарю. – user3915477

Смежные вопросы