Javascript: слияние облачных Firestore заменяет данные - PullRequest
0 голосов
/ 02 июня 2018

мой исходный код для записи данных - это

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);
});

Затем я хочу объединить новую информацию в мое поле

  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 & B

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Параметр 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 рекомендует не использовать такое составное значение или массивы именно по этой причине: необходимость считывания существующего значения перед его обновлением снижает масштабируемость вашего решения.Посмотрите документацию по работе с массивами, списком и наборами для альтернатив.

0 голосов
/ 02 июня 2018

Ваше слияние можно изменить на обновление?

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);
            });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...