我需要在云firestore文档中的数组字段中添加一个值

时间:2017-12-17 18:21:41

标签: android google-cloud-firestore

我想在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");
                }
            });
        }
    }

1 个答案:

答案 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的数组。如果数组具有您查询的值的多个实例,则文档仅包含在结果中一次。