【问题标题】:no FireBase FireStore , is it possible to read only until you find a specific document?没有 FireBase FireStore ,是否可以在找到特定文档之前只读?
【发布时间】:2020-09-22 11:52:14
【问题描述】:
  • 我有一个用户注册动物的应用,
  • 这些动物被抽签分开,
  • 所以,要知道动物在哪里,用户只需 输入他的 TAG,然后我会在我的所有数据库中查找该标签,
  • 示例:

收藏>很多

单据:Lot+NumberLot(Lot+number为ID,例如:Lot01、Lot02)。

在每个 Document Lot+NumberLot 我有一个子集合“动物”,在每个子集合动物中,

我有每只动物的文档,其中 ID 是用户键入的 TAG。

我的操作如下,用户输入标签但他不知道批次,所以,我在所有批次中搜索该标签,但是,如果用户有很多批次并且只想搜索 1 个动物,即使是从“动物”中检索单个文档,我也会为所有批次收费,我目前正在这样做:

-我的代码

lotRef.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                                    @Override
                                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if(task.isSuccessful()){
    
for (QueryDocumentSnapshot documentSnapshot: task.getResult()){
CollectionReference aniRef = lotRef.document(documentSnapshot.getId().toString())
                                                        .collection("Animals");
aniRef.get()
                                                        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
                                                                if(task.isSuccessful()) {
for (DocumentSnapshot documentSnapshot1 : task.getResult()) {
                                                                        Animal aniFounded= documentSnapshot1.toObject(Animal.class);
if (aniFounded.getTagAni() != null && aniFounded.getTagAni().equals(tagAni)) {
                                                                            Toast.makeText(Activity_AttSemBLE.this, aniFounded.getTagBoi().toString(),
                                                                                    Toast.LENGTH_LONG).show();
                                                                            founded = true;
                                                                            break;
    }
      }
     }else{
                                                                    Toast.makeText(Activity_AttSemBLE.this, "Not found", Toast.LENGTH_LONG).show();
    }
     }
        });
if(founded){
    founded = false;
     break;
                       }
                               }
                          }else{
                                            Toast.makeText(Activity_AttSemBLE.this, "No animal found", Toast.LENGTH_LONG).show();
                                        }
                                    }
                                });

如果动物存在,这个程序会找到动物,但我一直在阅读所有文件和所有地段,我想确保在找到动物后,我不会再被收费,如果我在哪里仍会向我收取所有文件的费用?

Firestore 图片示例:

例如,我想找到 041712 TAG,但我不知道它所在的批次(因为用户不会记住批次,只记得标签),我不想必须经过所有批次和标签都找到它,我希望找到他后,我不需要阅读其余部分,因此我不会消耗不必要的查询

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    您有一个动物对象,其文档 ID 为 041712。如果此 id 也作为属性包含在该文档中,要在不知道批次的情况下获取所有动物,则需要 collection group query。在代码中,它应该类似于:

    db.collectionGroup("Animals").whereEqualTo("id", "041712").limit(1).get()
        .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                // Iterate the queryDocumentSnapshots object
            }
        });
    

    【讨论】:

    • 你相信这样我会消耗更少的数据库吗?据我所知,他目前正在阅读所有的收藏和子收藏
    • 它正在读取整个数据库中名称为Animals 的所有集合。谈到 Firestore,它与消耗多少无关,而与返回的文档数量有关。返回的每个文档都算作一个文档已读。因此,例如,如果您的查询返回 5 只动物,则您必须支付 5 次读取操作。
    • 基本的事情是阅读直到找到文件,因为我知道那只动物只会在一个批次中
    • 那么,如果在这次咨询中我只返回一只与这只动物具有相同 id 的动物,那么我是否只为那只动物付费?
    • 在这种情况下,添加一个limit(1) 呼叫,就像我更新的答案一样。
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2020-11-30
    • 2019-01-08
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多