我想在Firestore文档中为数组添加值,并将它们作为列表或数组返回。
这是我的代码,它只是在0索引处替换数组值,然后我创建了一个列表并添加了返回布尔值的值。
FirebaseFirestore db = FirebaseFirestore.getInstance();
final DocumentReference doc = db.collection("RoomInformation").document(model.getRoomAdmin());
db.collection("RoomInformation").document(model.getRoomAdmin()).update(freshUser).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
doc.update("onlineUsers" , Arrays.asList("user" , facebookUserName)).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
new OurToast().myToast(view.getContext() , facebookUserName + " Join The Room");
}
});
}
}
答案 0 :(得分:0)
如关于arrays的官方文档中所示:
虽然Cloud Firestore可以存储数组,但它不支持查询数组成员或更新单个数组元素。
以下面的代码片段为例:
public class ArrayPost {
String title;
String[] categories;
public ArrayPost(String title, String[] categories) {
this.title = title;
this.categories = categories;
}
}
ArrayPost myArrayPost = new ArrayPost("My great post", new String[]{
"technology", "opinion", "cats"
});
我们看到使用上面的数据结构,无法执行此查询。
还有一点需要注意,虽然Cloud Firestore可以存储数组,但这是一种反模式。 Firebase建议不要使用数组的众多原因之一是它使安全规则无法编写。我重新考虑你考虑一个替代数据结构,其中每个类别是地图中的关键,所有值都是true
。请看一下这个例子:
public class MapPost {
String title;
Map<String,Boolean> categories;
public MapPost(String title, Map<String,Boolean> categories) {
this.title = title;
this.categories = categories;
}
}
Map<String, Boolean> categories = new HashMap<>();
categories.put("technology", true);
categories.put("opinion", true);
categories.put("cats", true);
MapPost myMapPost = new MapPost("My great post", categories);
编辑2018年8月13日:
根据有关array membership的更新文档,现在可以使用whereArrayContains()
方法根据数组值过滤数据。一个简单的例子是:
CollectionReference citiesRef = db.collection("cities");
citiesRef.whereArrayContains("regions", "west_coast");
此查询返回每个城市文档,其中regions字段是包含west_coast的数组。如果数组具有您查询的值的多个实例,则文档仅包含在结果中一次。