如何在Firestore中的所有文档中添加新字段?

时间:2019-01-22 05:58:26

标签: firebase nosql google-cloud-firestore

假设我有100个带有字段的文档

Name Age Address

现在假设我的业务模式已经改变,我想添加新的现场呼叫PhoneNumber

如何在所有100个文档中添加字段PhoneNumber? 在NoSQL数据库上可能有这种东西吗?

2 个答案:

答案 0 :(得分:0)

您将必须编写代码来迭代所有文档以进行更新,然后在每个文档中实际更新一个新值。 Firestore没有与SQL中的“更新表名设置x = y其中...”类似的命令。

答案 1 :(得分:0)

  

在NoSQL数据库上有可能出现这种情况吗?

是的!假设您有一个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; }
}

要实际添加新属性并进行相应的更新,您需要使用setter。如果您直接在公共字段上设置值,则设置程序不是必需的。

  

如何在所有100个文档中添加电话号码字段?

@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。最后,将更新的对象设置在相应引用上。

如果您不使用模型类,请从此 post 中查看我的答案。