Как обновить всех детей в Firebase?

Я пытаюсь обновить firebase всех дочерних элементов на одном уровне дерева. Например что-то вроде этого:

firebase.child("auctions").child().update({a: true});

и это возвращает мне ошибку, потому что ребенок пуст. Есть ли способ обновить все дочерние аукционы?


person Petr Mašát    schedule 20.01.2016    source источник
comment
для ясности, у меня есть эта структура auctions->item1-›a-›true`, и у меня есть более одного элемента. Есть ли способ внести сдачу для всех a? Спасибо   -  person Petr Mašát    schedule 20.01.2016


Ответы (2)


Вам не нужен этот пустой вызов .child().

Что firebase.child("auctions").update({a: true}); собирается сделать, так это заменить /auctions/a/whatever на /auctions/a/true.

Если вы действительно хотите «обновить всех дочерних элементов на одном уровне дерева», то .set может работать лучше, поскольку он заменит все данные в конечной точке объектом, который вы ему даете. Итак, если вы запустили firebase.child("auctions").set({a: true});, то все под /auctions будет заменено на {a: true}

Если вы не хотите уничтожать все, что ниже /auctions, а вместо этого хотите уничтожить все, что ниже auctions/a, вы можете сделать firebase.child("auctions/a").set(true);.

Есть несколько способов добиться того, что вам нужно. Я просто не уверен на 100%, что вам действительно нужно.

person Tyler McGinnis    schedule 20.01.2016
comment
Я написал возможно не совсем понятную структуру firebase. У меня есть эта структура: auctions > item1 > a = 5, и я хотел бы установить все {{a}} в 0 (например). Есть ли способ, как я могу написать что-то вроде этого: firebase.child("auctions").child("*").update({a: 0}); Спасибо - person Petr Mašát; 20.01.2016

В какой-то момент вам нужно будет перебрать всех детей. Вот один простой способ сделать это:

firebase.child("auctions").on('value', function(snapshot) {
    snapshot.ref().update({a: true}); // or snapshot.ref if you're in SDK 3.0 or higher
});

В качестве альтернативы вы можете сначала собрать все обновления, а затем отправить их в Firebase как один (потенциально большой) оператор обновления:

var updates = {};
firebase.child("auctions").on('value', function(snapshot) {
    updates["auctions/"+snapshot.key+"/a"] = true;
});
snapshot.ref().update(updates);  // or snapshot.ref if you're in SDK 3.0 or higher

Оба фрагмента выполняют одно и то же, но последний отправляет одну команду, поэтому он более устойчив в случае сбоя сети.

person Frank van Puffelen    schedule 20.01.2016
comment
Привет, я пытаюсь это сделать, но все еще это плохой уровень JSON. Я сохраняю исходный JSON перед использованием в tmp2.aikidohostivar.cz/example/auctions-orig.json, а после использования используется следующая форма: tmp2.aikidohostivar.cz/example /auctions-after-req.json Как вы можете видеть, я пытаюсь изменить имя глобального атрибута, и это на плохом уровне: ( - person Petr Mašát; 20.01.2016
comment
в Firebase V3 .ref больше не является функцией — просто удалите () из первого примера - person Simon Kibsgård; 26.09.2017
comment
Как вы получите ссылку на снимок вне функции обратного вызова? - person Developer; 29.03.2018