Подтвердить что ты не робот

Обновление Firebase vs set

Как гласит название, я не могу получить различия между update и set. Кроме того, документы не могут мне помочь, так как пример обновления работает точно так же, если вместо этого я использую set.

Пример update из документов:

function writeNewPost(uid, username, title, body) {

    var postData = {
        author: username,
        uid: uid,
        body: body,
        title: title,
        starCount: 0
    };

    var newPostKey = firebase.database().ref().child('posts').push().key;

    var updates = {};
    updates['/posts/' + newPostKey] = postData;
    updates['/user-posts/' + uid + '/' + newPostKey] = postData;

    return firebase.database().ref().update(updates);
}

В том же примере, используя set

function writeNewPost(uid, username, title, body) {

    var postData = {
        author: username,
        uid: uid,
        body: body,
        title: title,
        starCount: 0
    };

    var newPostKey = firebase.database().ref().child('posts').push().key;

    firebase.database().ref().child('/posts/' + newPostKey).set(postData);
    firebase.database().ref().child('/user-posts/' + uid + '/' + newPostKey).set(postData);
}

Так что, возможно, пример из документов должен быть обновлен, потому что теперь он выглядит как update и set делает то же самое.

С уважением, Bene

4b9b3361

Ответ 1

Атомарность

Одно большое различие между двумя указанными вами образцами - это количество операций записи, которые они отправляют серверам Firebase.

В первом случае вы отправляете одну команду update(). Вся эта команда будет успешной или неудачной. Например: если у пользователя есть разрешение на отправку сообщения на /user-posts/' + uid, но у него нет разрешения на отправку сообщения на /posts, вся операция будет выполнена с ошибкой.

Во втором случае вы отправляете две отдельные команды. При тех же разрешениях запись в /user-posts/' + uid теперь будет успешной, а запись в /posts завершится с ошибкой.

Частичное обновление и полная перезапись

В этом примере не сразу видно другое различие. Но скажите, что вы обновляете название и тело существующего сообщения вместо того, чтобы писать новое сообщение.

Если вы используете этот код:

firebase.database().ref().child('/posts/' + newPostKey)
        .set({ title: "New title", body: "This is the new body" });

Вы бы заменили всю существующую запись. Таким образом, исходные поля uid, author и starCount исчезнут, и будут только новые title и body.

Если с другой стороны вы используете обновление:

firebase.database().ref().child('/posts/' + newPostKey)
        .update({ title: "New title", body: "This is the new body" });

После выполнения этого кода будут сохранены оригинальные uid, author и starCount, а также обновленные title и body.