Javascript: слияние Cloud Firestore заменяет данные

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

var Cloud = firebase.firestore();

  Cloud.collection("IPA").doc("Allipas").set({
    IPlist: "A;B;",   
})
.then(function() {
    console.info("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.info("Document successfully written!");
})
.catch(function(error) {
    console.error("Error writing document: ", error);
});

но он заменяет поле только на 'C', и я не вижу A и B

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
597
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Нет, я хочу объединить новую строку в существующее поле. Это отличается от обновления

Prince Hamza 02.06.2018 15:23
Ответ принят как подходящий

Опция 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.info("Transaction successfully committed!");
}).catch(function(error) {
    console.info("Transaction failed: ", error);
});

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

Другие вопросы по теме