Как добавить новые поля во все документы в Firestore?

Допустим, у меня есть 100 документов с полями

NameAgeAddress

Теперь предположим, что моя бизнес-модель изменилась, и я хочу добавить новый вызов поля PhoneNumber.

Как добавить поле PhoneNumber во все 100 документов? Возможно ли такое в базе данных NoSQL?

Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
0
0
831
2

Ответы 2

Вам придется написать код для повторения всех документов для обновления, а затем фактически обновить новое значение в каждом из них. В Firestore нет такой команды, как «обновить набор имен таблиц x = y, где …» в SQL.

Is is possible to such stuff on NoSQL database?

Да, это! Предположим, у вас есть класс модели User, который выглядит так:

public class User {
    private String name;
    private int age;
    private String address;
    private String phoneNumber; //Property that is newly added

    public User() {}

    public User(String name, int age, String address, String phoneNumber) {
        this.name = name;
        this.age = age;
        this.address = address;
        this.phoneNumber = phoneNumber;
    }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }

    public String getAddress() { return address; }
    public void setAddress(String address) { this.address = address; }

    public String getPhoneNumber() { return phoneNumber; }
    public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; }
}

Чтобы фактически добавить новое свойство и соответствующим образом обновить его, вам нужно использовать сеттеры. Если вы устанавливаете значения непосредственно в общедоступные поля, установщики не являются обязательными.

How to add field PhoneNumber in all 100 documents?

Как также упомянул @Doug Stevenson в своем ответе, чтобы решить эту проблему, вам необходимо перебрать все документы в вашей коллекции users. Поэтому используйте следующие строки кода:

db.collection("users").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (DocumentSnapshot document : task.getResult()) {
                User user = document.toObject(User.class);
                user.setPhoneNumber("+1-111-111-111"); //Use the setter
                String id = document.getId();
                db.collection("users").document(id).set(user); //Set user object
            }
        }
    }
});

Результатом этого кода будет добавление свойства phoneNumber ко всем объектам User со значением по умолчанию +1-111-111-111. Вы также можете установить значение null, если вам так удобнее. В конце обновленный объект устанавливается прямо на соответствующую ссылку.

Если вы не используете класс модели, см. мой ответ из этого Почта.

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