假设我有100个带有字段的文档
Name
Age
Address
现在假设我的业务模式已经改变,我想添加新的现场呼叫PhoneNumber
。
如何在所有100个文档中添加字段PhoneNumber
?
在NoSQL数据库上可能有这种东西吗?
答案 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 中查看我的答案。