【问题标题】:search for sub-document value in firestore在 Firestore 中搜索子文档值
【发布时间】:2019-09-20 19:41:08
【问题描述】:

我正在使用具有以下结构的 Firestore 数据库:

我有一个名为NBDB的集合,里面有每个用户的uid的文档。例如,我有 2 个用户,所以我有 2 个文档称为:ZxK2BR...xy9BHY...

在每个用户文档中都有另一个名为 MyBooks 的集合,其中包含用户搜索的所有书籍的文档。

以下是我数据库中的图片:

我想制作一个主页屏幕,从用户在应用数据库中拥有的所有图像中随机显示 20 张图像。

据我了解,我需要进入每个用户文档并搜索它拥有的所有my books,然后为下一个用户移动。

我的最终目标是读取所有用户的 BookID 值并随机选择 20 个

我使用以下方法从特定用户获取所有BookID

FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference MyDB = db.collection( "NBDB" ).document(auth.getUid()).collection( "MyBooks" );

MyDB.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            List<String> list = new ArrayList<>();
            for (QueryDocumentSnapshot document : task.getResult()) {
                list.add(document.getString( "BookID" ));
            }
            Log.d(TAG, list.toString());
        } else {
            Log.d(TAG, "Error getting documents: ", task.getException());
        }
    }
});

谢谢

【问题讨论】:

  • 您这里似乎没有一个名为“mypics”的集合。我看到你有一个名为“USERS”的顶级集合,然后它下的每个文档都有另一个名为“users”的子集合。 “mypics”看起来像子集合文档中的一个字段。您能否编辑问题以更清楚地说明您如何构建数据库以及文档的相关字段是什么?要么这样,要么纠正代码,如果它不完全是你正在使用的。
  • 澄清一下,您是在寻找一位用户的 20 张照片还是所有用户的所有照片中的 20 张照片?
  • 我从所有用户的所有图片中寻找 20 张图片作为 20 张随机图片。

标签: java android google-cloud-firestore


【解决方案1】:

我认为您要做的是从任何用户的子集合中随机抽取 20 张不同的图像。也就是说,如果您不选择使用其他结构并希望嵌套所有数据,则可以选择 collectionGroup 查询。

关于“随机”的部分有点棘手,您可能想使用一些 hacky 方法来使其工作。但首先要访问各种用户的嵌套子集合:

所有这些数据,无论用户是谁,都存在于名为 MyBooks 的集合中,因此您可以在 MyBooks 上运行 collectionGroup 查询。

我会用随机图像hacky位做的方式是,在部分伪代码中给你一个想法(我在Java SDK中确认了collectionGroups):

usedImages = []
for numbers 0 to 19 {
   let num = false
   while (!num) {
     let tempNum = Math.floor(Math.random() * 10);
     if (!( usedImages.includes(tempNum)){
        num = tempNum
     }
   }

   var allBooks = db.collectionGroup('MyBooks').where('imageKey', '==', num);
     allBooks.get().then(function (querySnapshot) {
        querySnapshot.forEach(function (doc) {
        console.log(doc.id, ' => ', doc.data());
     });
   });

}

代码的想法是生成 20 个随机且唯一的数字 num(可能比我上面一起破解的更好的方法),然后获取该数字并查找 MyBooks 中的所有条目imageKey 存在。这是绕过随机图像代码的 hacky 方式,您需要为每个图像代码添加一个全局唯一 ID。

Collection Group 没有指定父集合的路径,因此它允许您一次查看所有集合。

在上述伪代码中,您正在运行 20 个集合组查询。

您可以在此处找到有关集合组查询的更多信息:https://firebase.google.com/docs/firestore/query-data/queries#collection-group-query

【讨论】:

  • 当我执行此 collectionGroup 查询时,据我了解,我需要将其编写如下: db.collectionGroup("MyBooks").whereEqualTo("XXX", "XXX").get() 但是在 MyBooks 集合中,还有一个我不知道等于的唯一 ID。另外,如果有一些好主意,我不介意使用另一种结构,但是我看到文档不能包含太多信息,所以如果有很多书,它就行不通了。
  • 我提供的示例使用单一方式“随机”检索文档。基本上,这个想法是拥有从 1 到 N 的数字,并且能够调用一个随机数 1-N 来使用你说你没有的 XXX。它需要被创建。
  • 我还在谈论从收藏中获取书籍,在第一阶段我可以不随机处理。主要问题是获取数据 BookID 列表
  • 您可以在没有 where 子句的情况下运行 collectiongroup 来获取所有项目。
猜你喜欢
  • 2020-08-25
  • 2017-01-13
  • 2018-04-03
  • 2015-06-01
  • 2017-07-11
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多