Как добавить новое поле в массив данных в базе данных реального времени Firebase, используя функции Firebase? - PullRequest
0 голосов
/ 28 августа 2018

Я новичок в Firebase. У меня есть данные в базе данных реального времени Firebase со следующей структурой. Мое требование - добавить новое поле в несколько (выбранных) записей, представленных в разделе «пользователь».

Исходные данные

db—>user
    —pushId_1 (Auto Generated via push command)
        name: user1
    pushId_2
        name: user2

Обязательные окончательные данные с добавлением еще одного поля («newField»)

db—>user
    —pushId_1
        name: user1
        newField: sample data
    pushId_2
        name: user2
        newField: sample data

Я написал следующий код для этого.

exports.sampleFunction = functions.database.ref('/db/user/{pushId}/')
    .onCreate((snap, context) => {
        console.log('onCreate called with snapshot id = ' + snap.key);
        admin.database().ref('/db/user/').once('value').then(snapshot => {
            if (snapshot.numChildren() > 1) {
                var updates = {};
                var count = 0;
                snapshot.forEach((child) => {
                    if (!child.hasChild('newField') && count < 2) {
                        updates[child.key] = { newField: 'sample data' };
                        count++;
                    }
                });
                //return snapshot.ref.set(updates);   //set is also giving same result.
                return snapshot.ref.update(updates);
            }
            return null;
        }).catch(error => {
            console.error("error in fetching data from db." + error);
        });
        return null;
    });

Проблема в том, что этот код удаляет существующее поле «name» и заменяет его на «newField». Не могли бы вы помочь мне в добавлении этого нового поля в данные без удаления существующих полей.

Спасибо

1 Ответ

0 голосов
/ 28 августа 2018

Это потому, что вы используете set вместо обновления узла.

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

return snapshot.ref.update(updates);

Также вы неправильно вводите данные для обновления. В ключе вы должны иметь путь относительно ссылки, которую вы называете обновлением, вместо вложенных объектов. Вместо updates[child.key] = { newField: 'sample data' }; должно быть

updates[`${child.key}/newField`] = 'sample data';

теперь, когда вы вызываете update с child родительским снимком, т. Е. Снимком, он точно знает, какие поля обновлять.

Подробнее см. В документах: https://firebase.google.com/docs/database/admin/save-data#section-update

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...