Javascript:Cloud Firestore合并正在替换数据

时间:2018-06-02 12:45:38

标签: javascript rest firebase google-cloud-firestore

我编写数据的初始代码是

var Cloud = firebase.firestore();

  Cloud.collection("IPA").doc("Allipas").set({
    IPlist: "A;B;",   
})
.then(function() {
    console.log("Document successfully written!");
})
.catch(function(error) {
    console.error("Error writing document: ", error);
});

然后我想将新信息合并到我的Field

  var Cloud = firebase.firestore();

  Cloud.collection("IPA").doc("Allipas").set({
    IPlist: "C;",   
} , {merge : true})
.then(function() {
    console.log("Document successfully written!");
})
.catch(function(error) {
    console.error("Error writing document: ", error);
});

但它取代了' C'只是,我不能看到A&乙

2 个答案:

答案 0 :(得分:1)

merge: true选项将您在API调用中提供的字段与文档中的现有字段合并。它不会将单个值与字段的现有值合并。

如果要更新字段的现有值,则必须首先读取该字段的值,然后在代码中更新它,最后将其写回数据库。

这通常在事务中完成,以确保没有其他人可以同时编写冲突的更新。一个例子:

var docRef = Cloud.collection("IPA").doc("Allipas");
Cloud.runTransaction(function(transaction) {
    // This code may get re-run multiple times if there are conflicts.
    return transaction.get(docRef).then(function(doc) {
        if (!doc.exists) {
            throw "Document does not exist!";
        }

        var newIPlist = doc.data().IPlist + "C;";
        transaction.update(docRef, { IPList: newIPList });
    });
}).then(function() {
    console.log("Transaction successfully committed!");
}).catch(function(error) {
    console.log("Transaction failed: ", error);
});

请注意,Firebase建议不要使用此类复合值或数组,正是出于这个原因:在更新之前必须读取现有值会降低解决方案的可伸缩性。请查看documentation on working with arrays, list, and sets替代方案。

答案 1 :(得分:0)

您的合并可以更改以进行更新吗?

updteSomething() {
        this.db.collection('IPA').doc(Allipas).update({
            IPlist: ""A;B;C;",
        })
            .then(function () {
                console.log("Document successfully deleted!");
            }).catch(function (error) {
                console.error("Error removing document: ", error);
            });
    }