【问题标题】:Firestore : Query all the elements in array in androidFirestore:在android中查询数组中的所有元素
【发布时间】:2018-02-27 05:05:31
【问题描述】:

我有一个像

这样的数据结构
 /Split       // Collection
   {authid}   // Document
      /SentIvitation //Collection
          {auto-id}  //Documnet
            amount    //array
             0:10
             1:10
             2:10
             Phonenumbers//array
               0:987654321
               1:123456789
               2:234567890

我需要查询电话号码中的所有元素,并且我必须检查这些电话号码是否已经存在于另一个集合中。 我的数据结构的下一条路径是

/deyaUsers   //Collection
  {authid}.   //Documnet
      Name: "abc"
      Email: "abc@gmail.com"
      Phonenumber:987654321

是否可以在没有任何索引的情况下在 Firestore 中使用?

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    official documentation

    虽然 Cloud Firestore 可以存储数组,it does not support 查询数组成员或更新单个数组元素。

    如果您只想获取整个 papers 数组,则需要像这样遍历 Map

    Map<String, Object> map = documentSnapshot.getData();
    for (Map.Entry<String, Object> entry : map.entrySet()) {
        if (entry.getKey().equals("Phonenumbers")) {
            Log.d("TAG", entry.getValue().toString());
        }
    }
    

    但请注意,即使 Phonenumbers 对象作为数组存储在数据库中,entry.getValue() 也会返回 ArrayList,而不是 array

    只有在使用多个属性查询数据库时才需要使用索引。但不是你的情况。

    如果您考虑这种替代数据库结构,则更好的方法是,其中每个电话号码都是地图中的键,并且所有值都为真:

    Phonenumbers: {
        "987654321": true,
        "123456789": true,
        "234567890": true
    }
    

    2018 年 8 月 13 日编辑:

    根据有关array membership 的更新文档,现在可以使用whereArrayContains() 方法根据数组值过滤数据。一个简单的例子是:

    CollectionReference citiesRef = db.collection("cities");
    citiesRef.whereArrayContains("regions", "west_coast");
    

    此查询返回每个城市文档,其中区域字段是包含 west_coast 的数组。如果数组有多个您查询的值的实例,则该文档仅包含在结果中一次。

    【讨论】:

    • 有一条备用路径
    • 为了检查这些电话号码是否存在于另一个集合中,首先您需要获取它们。但这在 Cloud Firestore 中是不可能的。您不能查询数组成员。
    • 你能说一下如何将 phonenumber 数组存储到 firestore 以满足以上要求
    • 电话号码是一个长数组。在我的情况下 987654321 是值。我们可以将它用作文件名吗?我们可以获取它。
    • 是的,这是另一种结构,其中电话号码将成为Map 中的键。
    【解决方案2】:

    你需要有这样的查询:

    当您从集合查询到文档然后从文档集合时。

    说明:

    父节点为"Split" 首先获取"Split" collection 然后根据"authid" 可以有多个文档 因此您将根据currentUser 获取文档(用户有登录,从FirebaseAuth获取)

    根据authId 获得特定用户的document 后,您将从authId document 获取该特定用户集合的"SendInvitations"

    代码:

    CurrentUser currentUser = FirebaseAuth.getCurrentUser();
    
    firestore.collection("Split").document(currentUser.getUid()).collection("SendInvitation")
    .get()
    .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                                @Override
                                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                                    if (task.isSuccessful()) {
                                        //Handle Success
                                    } else {
                                        //Handle Error
                                    }
                                }
                            });
    

    根据结构,这将是查询。

    希望对你有帮助。

    【讨论】:

    • 我已经编辑了我的问题现在我需要如何编写查询
    • 查询仍将使用更新结构。
    • 你能解释一下吗
    • 请查看答案
    • 这里我只需要电话号码字段
    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多