【问题标题】:How do I query Firestore Array Value?如何查询 Firestore 数组值?
【发布时间】:2020-04-07 07:14:19
【问题描述】:

如何查询带有月份值的数组日期?

String monthString = "12";
Query queryZero = db.collection("Users").document(mCurrentUser).collection("Dates").whereArrayContainsAny("dates", ???);

我必须把什么放在'???'使用 dd/MM/yyyy 检索日期

【问题讨论】:

    标签: java android arrays string google-cloud-firestore


    【解决方案1】:
    public static void getData(){
        DatabaseReference database = FirebaseDatabase.getInstance().getReference("Users").child(mCurrentUser).child("Dates");
        database_course.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    String key = ds.getKey(); //7UE......
                    HashMap<String, ArrayList<String>> datesHashMap = ds.get(key);
                    for(int i =0;i<datesHashMap.get("dates").size();i++){
                        String date = datesHashMap.get("dates").get(i);//08/12/2019
                        if (date.substring(3,5).equals("12")){
                            //put your code
                        }
                    }
    
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
    
            }
        });
    }
    

    【讨论】:

    • 这对于 Firebase 数据库来说是一种完美的方法,但我正在尝试将此逻辑应用到 Firestore 查询中。
    【解决方案2】:

    Firestore 目前不支持这种查询。但是,一种可能的解决方法是在文档中存储额外的月份数组并执行: db.collection("Users").document(mCurrentUser).collection("Dates").whereArrayContains("months", "12");

    另一个解决方案类似于@Ruyut 的回答。但这会检索集合中的所有文档,并且您必须在客户端执行过滤,如果您有数千个文档,这可能会降低性能。

     FirebaseFirestore.getInstance().collection("Users")
        .get()
        .addOnSuccessListener(
            new OnSuccessListener<QuerySnapshot>() {
               @Override
               public void onSuccess(QuerySnapshot documentSnapshots) {
                   for (DocumentSnapshot ds : documentSnapshots.getDocuments()) {
                       // same code as @Ruyut's answer
                   }
               }
            }
        );
    

    【讨论】:

    • 第二个选项在这种情况下并不理想,因为您提到的文档量很大,但我感谢您的帮助。最后,我实现了一个不同的适配器逻辑,它检查当前日期并返回 X 天并检查这些值。
    猜你喜欢
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多