web-dev-qa-db-ja.com

Firebaseアップデートとセット

タイトルにあるように、updatesetの違いはわかりません。また、代わりに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);
}

updatesetはまったく同じことをするようになったため、ドキュメントの例を更新する必要があります。

よろしく、ベネ

57
Bene

原子性

指定した2つのサンプルの大きな違いの1つは、Firebaseサーバーに送信する書き込み操作の数です。

最初のケースでは、単一のupdate()コマンドを送信しています。そのコマンド全体が成功または失敗します。たとえば、ユーザーが/user-posts/' + uidに投稿する権限を持っているが、/postsに投稿する権限を持っていない場合、操作全体が失敗します。

2番目のケースでは、2つの個別のコマンドを送信しています。同じ権限で、/user-posts/' + uidへの書き込みは成功しますが、/postsへの書き込みは失敗します。

部分更新と完全上書き

この例では、別の違いはすぐにはわかりません。ただし、新しい投稿を作成するのではなく、既存の投稿のタイトルと本文を更新するとします。

このコードを使用する場合:

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

既存の投稿全体を置き換えることになります。したがって、元のuidauthor、およびstarCountフィールドはなくなり、新しいtitleおよびbodyのみが存在します。

一方、アップデートを使用する場合:

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

このコードの実行後、元のuidauthor、およびstarCountは、更新されたtitleおよびbodyと同様にそこに残ります。

108